我們應該了解的基礎知識
所謂的KVO就是key-value-observeing, 翻譯過來就是 觀察者模式
首先我們應該知道KVO是不能直接監聽控制器ViewController數組的變化的,需要將數組定義在模型中,然后控制器ViewController持有模型對象,通過該對象才能監聽。
注冊監聽
addObserver:<#(nonnull NSObject *)#> forKeyPath:<#(nonnull NSString *)#> options:<#(NSKeyValueObservingOptions)#> context:<#(nullable void *)#>
重寫監聽方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context
移除監聽
[ removeObserver:self forKeyPath:@""];
代碼如下
首先先設置ViewController的分類
@interface Model : NSObject
@property (strong,nonatomic)NSMutableArray *modelArray;
@end
實現部分
-(NSMutableArray *)modelArray{
if(!_modelArray){
_modelArray = [NSMutableArray array];
}
return _modelArray;
}
@end
//1.創建模型對象
[self.model addObserver:self forKeyPath:@"modelArray" options:NSKeyValueObservingOptionNew context:nil];
需要注意的是數組的添加/刪除必須采用這個方法 mutableArrayValueForKeyPath
[[self.model mutableArrayValueForKeyPath:@"數組名字"] addObject:@"添加的Object"];
[[self.model mutableArrayValueForKeyPath:@"數組名字"] removeObject:@"刪除的Object"];
監聽方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context{
if (![keyPath isEqualToString:@"modelArray"]) {
// NSLog(@"%ld",_model.modelArray.count);
return;
}
}
移除監聽
- (void)dealloc {
[_model removeObserver:self forKeyPath:@"modelArray"];
}
PS:日積月累, 天天進步
紀念單身狗的每一天...