如何实现对数组NSMutableArray的KVO

KVO原理

原理很简单,就是重写了被观察属性的 set 方法
如果直接访问变量,是无法触发的。

那针对数组的话,通常我们只是调用addObject,或者removeObject,
但以上方法并不会触发set方法,也就不会触发KVO的。

那么,该如何实现对 NSMutableArray 的 KVO 呢?
官方为我们提供了这个方法

解决方案:

- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key

举个例子:

@property (nonatomic, strong) NSMutableArray *lines;

对需要观察的属性进行注册

[self addObserver:self 
forKeyPath:@"lines" 
options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld 
context:nil];

触发方法,增删操作,使用addObject,或者removeObject并不会触发KVO

 [[self mutableArrayValueForKey:@"lines"] addObject:@"1"],

观察回调方法

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary<NSString *,id> *)change
                       context:(void *)context
{
    if([keyPath isEqualToString:@"lines"]){
        NSMutableArray * lines = [self mutableArrayValueForKey:@"lines"];
        if (lines.count) {
            //do sth
        }else{
           //do sth
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容