iOS NSMutableArray KVO

iOS 中 KVO (key-value-observing) 的原理,簡單來說就是重寫了被觀察屬性的 set 方法,一般情況下只有通過調(diào)用 set 方法對值進(jìn)行改變才會觸發(fā) KVO,直接訪問實例變量修改值是不會觸發(fā) KVO 的。

例如我們一般要監(jiān)聽name屬性的變化
監(jiān)聽name屬性.png

這樣是沒有任何問題的,但是當(dāng)我們項目中對tableView的dataSource的變化要實現(xiàn)實時更新的時候,我們就要監(jiān)聽tableView.dataSource,按照此思路那我們下面就來實現(xiàn)一下吧
監(jiān)聽dataSource變化.png

這是什么原因呢?這是因為NSMutableArray是一個可變的容器,當(dāng) [self.dataSource addObject:@"3"]執(zhí)行時,我們改變只是dataSource里面的item,并沒有改變dataSource,因為KVO的本質(zhì)是系統(tǒng)監(jiān)測到某個屬性的內(nèi)存地址或常量改變時
dataSource是否發(fā)生改變.png

我們最終的目的并不是為了監(jiān)聽dataSource變化,而是dataSource里面的內(nèi)容。
那么,該如何實現(xiàn)對 NSMutableArray 的 KVO 呢?官方為我們提供了這個方法- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key
像之前一樣,為可變數(shù)組添加 KVO。在加減元素時,使用這個方法來獲取我們要進(jìn)行操作的可變數(shù)組,便可以像普通的屬性一樣,收到它變化的消息。

正確監(jiān)聽dataSource變化.png

那么為什么mutableArrayValueForKey:這個方法可以監(jiān)聽dataSource內(nèi)部變化呢?mutableArrayValueForKey:默認(rèn)采用的是搜索模式,在NSMutableArray搜索匹配insertObject:atIndex:和removeObjectAtIndex:等能引起容器內(nèi)部Object發(fā)生改變的方法,如果發(fā)現(xiàn)至少一個插入或者刪除方法,就會發(fā)送發(fā)送消息給原始接受者。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容