KVO总结

@interface KvoOperation : NSOperation

@property (nonatomic, getter=isFinished) BOOL finished;
@property (nonatomic, strong) NSString *k;

@property (nonatomic, strong) NSMutableArray *mutArr;

-(void)insertObject:(id)object inMutArrAtIndex:(NSInteger)index;

@end

@implementation KvoOperation
@synthesize finished = _finished;
@synthesize k = _k;
@synthesize mutArr = _mutArr;

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key {
    return NO;
}

- (void)setK:(NSString *)k {
    [self willChangeValueForKey:@"k"];
    _k = k;
    [self didChangeValueForKey:@"k"];
}

- (void)setFinished:(BOOL)finished {
    [self willChangeValueForKey:@"isFinished"];
    _finished = finished;
    [self didChangeValueForKey:@"isFinished"];
}

-(void)insertObject:(id)object inMutArrAtIndex:(NSInteger)index {
    [self willChange:(NSKeyValueChangeInsertion) valuesAtIndexes:[NSIndexSet indexSetWithIndex:index] forKey:@"mutArr"];
    [_mutArr insertObject:object atIndex:index];
    [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndex:index] forKey:@"mutArr"];
}

@end
  • + (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key 返回 NO 可以屏蔽原生 set 方法出发的kvo监听,但是对于手动实现的kvo无效。

  • 非集合类型手动触发 kvo :willChangeValueForKey:、didChangeValueForKey: ,不受automaticallyNotifiesObserversForKey: 屏蔽

  • 集合类型(eg NSMutableArray)增、删、替换item不能触发kvo,如果用mutableArrayValueForKey:获取mArr,增、删、替换item 可触发kvo,且受automaticallyNotifiesObserversForKey:方法屏蔽作用

NSMutableArray *mArr = [_kvoOption mutableArrayValueForKey:@"mutArr"];
[mArr addObject:@"a"];
  • 集合类型增、删、替换 item 手动触发kvo :例如插入时候调用下面方法,可触发kvo,不受automaticallyNotifiesObserversForKey: 屏蔽

-(void)insertObject:(id)object inMutArrAtIndex:(NSInteger)index {
    [self willChange:(NSKeyValueChangeInsertion) valuesAtIndexes:[NSIndexSet indexSetWithIndex:index] forKey:@"mutArr"];
    [_mutArr insertObject:object atIndex:index];
    [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndex:index] forKey:@"mutArr"];
}
  • Mark:NSOperation finished 属性为只读,这里重写,通过手动触发finished kvo,达到触发 completionBlock 目的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值