前言
讲真,这个KVO我没怎么用过,所有出发点只是学习,并没有满足什么需求的强烈愿望,不过这个也是OC重要的一部分,还是得看看。
KVO触发的一些理解
首先呢,apple提供给我们的是自动的触发方法。手动触发呢也是一定程度上对自动触发的模拟。那么我们将触发的方法放在何处才能达到目的呢,这个应该稍微分析下。KVO说白了我认为是一种KVC的处理方法,根本上来说还是作用于属性的,让我们来及时发现属性的变化。那么我们的手动触发方法应该放在属性改变这一块,对于属性的改变,apple提供了一个现成的方法-set,所以我们的手动触发方法就应该放在要作用的属性的set方法里。(完美分析,恩,都是假的)
KVO触发我们需要用到什么
首先是两个方法
- (void)willChangeValueForKey:(NSString *)key
- (void)didChangeValueForKey:(NSString *)key
这两个方法就是字面上意思,在set之前调用willChangeValueForKey,在set之后调用didChangeValueForKey,因此我们如果要实现KVO手动调用,也就实在set方法中,调用上述两个方法。
怎么手动出发这个方法
+ (BOOL)automaticallyNotifiesObserversOfName
{
return NO;
}
- (void)setName:(NSString *)name
{
if(_name == name){
return;
}
[self willChangeValueForKey:@"name"];
_name = name;
[self didChangeValueForKey:@"name"];
}
结果
2017-07-14 13:28:09.614 textview[16786:1498912] have a new name 飞度
2017-07-14 13:28:09.614 textview[16786:1498912] have a new name 思域
2017-07-14 13:28:09.614 textview[16786:1498912] have a new name 手扶拖拉机
首先呢我们先关闭自动调用,一旦调用了,我们的KVO就是失效啦。
然后我们重写了set方法,于是就有了接下来的打印,所以,我宣布,成功啦。
完结撒花。
【整理来自于手动触发KVO】
网友评论