前言
講真,這個(gè)KVO我沒(méi)怎么用過(guò),所有出發(fā)點(diǎn)只是學(xué)習(xí),并沒(méi)有滿足什么需求的強(qiáng)烈愿望,不過(guò)這個(gè)也是OC重要的一部分,還是得看看。
KVO觸發(fā)的一些理解
首先呢,apple提供給我們的是自動(dòng)的觸發(fā)方法。手動(dòng)觸發(fā)呢也是一定程度上對(duì)自動(dòng)觸發(fā)的模擬。那么我們將觸發(fā)的方法放在何處才能達(dá)到目的呢,這個(gè)應(yīng)該稍微分析下。KVO說(shuō)白了我認(rèn)為是一種KVC的處理方法,根本上來(lái)說(shuō)還是作用于屬性的,讓我們來(lái)及時(shí)發(fā)現(xiàn)屬性的變化。那么我們的手動(dòng)觸發(fā)方法應(yīng)該放在屬性改變這一塊,對(duì)于屬性的改變,apple提供了一個(gè)現(xiàn)成的方法-set,所以我們的手動(dòng)觸發(fā)方法就應(yīng)該放在要作用的屬性的set方法里。(完美分析,恩,都是假的)
KVO觸發(fā)我們需要用到什么
首先是兩個(gè)方法
- (void)willChangeValueForKey:(NSString *)key
- (void)didChangeValueForKey:(NSString *)key
這兩個(gè)方法就是字面上意思,在set之前調(diào)用willChangeValueForKey,在set之后調(diào)用didChangeValueForKey,因此我們?nèi)绻獙?shí)現(xiàn)KVO手動(dòng)調(diào)用,也就實(shí)在set方法中,調(diào)用上述兩個(gè)方法。
怎么手動(dòng)出發(fā)這個(gè)方法
+ (BOOL)automaticallyNotifiesObserversOfName
{
return NO;
}
- (void)setName:(NSString *)name
{
if(_name == name){
return;
}
[self willChangeValueForKey:@"name"];
_name = name;
[self didChangeValueForKey:@"name"];
}
結(jié)果
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 手扶拖拉機(jī)
首先呢我們先關(guān)閉自動(dòng)調(diào)用,一旦調(diào)用了,我們的KVO就是失效啦。
然后我們重寫(xiě)了set方法,于是就有了接下來(lái)的打印,所以,我宣布,成功啦。
完結(jié)撒花。
【整理來(lái)自于手動(dòng)觸發(fā)KVO】