美文网首页
浅谈KVO, iOS的开发之旅

浅谈KVO, iOS的开发之旅

作者: 不懂冯先生 | 来源:发表于2017-03-03 11:05 被阅读65次
    我们应该了解的基础知识

    所谓的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:日积月累, 天天进步
    纪念单身狗的每一天...

    相关文章

      网友评论

          本文标题:浅谈KVO, iOS的开发之旅

          本文链接:https://www.haomeiwen.com/subject/jhplgttx.html