淺談KVO, iOS的開發之旅

weixin_33935777發表於2017-03-03
我們應該瞭解的基礎知識

所謂的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:日積月累, 天天進步
紀念單身狗的每一天...

相關文章