我們知道,iOS 中 KVO (key-value-observing) 的原理,簡(jiǎn)單來(lái)說(shuō)就是重寫了被觀察屬性的 set 方法。自然,一般情況下只有通過(guò)調(diào)用 set 方法對(duì)值進(jìn)行改變才會(huì)觸發(fā) KVO厚棵,直接訪問(wèn)實(shí)例變量修改值是不會(huì)觸發(fā) KVO 的蕉世。
對(duì)于 NSMutableArray 內(nèi)容的變化進(jìn)行觀察,是我們比較常見(jiàn)的一個(gè)需求婆硬。但是在調(diào)用它的 addObject狠轻、removeObject 系列方法時(shí),并不會(huì)觸發(fā)它自己的 set 方法彬犯。所以向楼,對(duì)一個(gè)可變數(shù)組進(jìn)行觀察查吊,在它加減元素時(shí)不會(huì)收到期望的消息。
那么湖蜕,該如何實(shí)現(xiàn)對(duì) NSMutableArray 的 KVO 呢逻卖?官方為我們提供了這個(gè)方法- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key
像之前一樣,為可變數(shù)組添加 KVO昭抒。在加減元素時(shí)评也,使用這個(gè)方法來(lái)獲取我們要進(jìn)行操作的可變數(shù)組,便可以像普通的屬性一樣灭返,收到它變化的消息盗迟。
舉個(gè)例子,myItems 是我們要進(jìn)行 KVO 的一個(gè)屬性熙含,它的定義如下:
@property (nonatomic, strong) NSMutableArray *myItems;
在它進(jìn)行添加元素時(shí)罚缕,使用如下方法:
[[self mutableArrayValueForKey:@"myItems"] addObject:item];
這樣,我們便實(shí)現(xiàn)了對(duì) NSMutableArray 的 KVO怎静。