我想知道是否有理由在KVO vs NSNotificationCenter觀察中使用一個。性能,內存使用情況,速度等?KVO觀察與NSNotificationCenter觀察
回答
這兩個並不總是可以互換的。從概念上講,KVO僅用於觀察對象的屬性。例如,您不能使用KVO來替換NSApplicationWillTerminateNotification
,因爲它通知觀察者有關發生的事件,而不是對象屬性的更改。
至於性能和內存使用情況,它們都很快並且使用的內存可以忽略不計。 NSNotificationQueue
已合併停止通知洪水。就我所知,KVO沒有任何合併,這確實給我帶來了性能問題。我觀察了數百個對象,當這些對象發生批量更新時,我會得到數百個KVO回調。這不是KVO本身的性能問題,而是由於批量更新而導致我自己的代碼運行。
性能並不是真正的問題,它更多的是最適合這個問題。如果是屬性更改,請使用KVO。如果它不是屬性更改,則根據您是需要單個觀察者還是多個觀察者來使用委託或通知。
一個非常古老的問題,但想到添加一些觀點。我同意Tom Dalling's answer,但是,在大型應用程序中有很多場景,我們傾向於爲對象的屬性添加觀察者,而我們不能,或者,我們錯過了將其從觀察者列表中刪除。
讓我們從我的應用程序中考慮以下情況 - ViewController顯示一個蛇對象,我正在觀察此對象上的屬性更改 - 「毒液」。所以無論viewController需要顯示不同的蛇,我只需從該蛇對象的觀察者中刪除視圖控制器。
該應用程序演變爲一個蛇列表,而不是一條蛇,這意味着我必須觀察該物體中所有蛇的屬性。現在,當一個老蛇從數組中移除時,我應該瞭解這個事件,以便我可以從這個蛇對象中移除視圖控制器作爲觀察者。要做到這一點,我必須首先觀察陣列本身的變化。爲此,我必須遵循特定的協議將對象插入到數組中,並將它們從數組中移除。這種複雜性依賴於此。我們都知道不從觀察對象中刪除觀察者以及該對象是否被操作系統釋放的後果!
以上只是一個例子舉,這裏的主要問題是我不能讓志願觀察員名單給定對象從觀察者刪除此對象得到釋放之前 - 這可以通過NSNotification並可以輕鬆實現NSNotificationCenter。有時,我傾向於使用NSNotification而不是KVO,但是,KVO總是在良好的設計實踐方面具有優勢。
- 1. UILabel KVO觀察
- 2. 刪除NSNotificationCenter觀察者
- 3. NSNotificationCenter刪除觀察者
- 4. ReactiveKit債券KVO觀察UserDefaults
- 5. KVO - 複製觀察對象
- 6. 觀察UISlider的值 - iPhone KVO
- 7. KVO在UITableViewCell中觀察NSMangedObject
- 8. NSNotificationCenter - 觀察反對時去除觀察者被釋放
- 9. NSNotificationCenter刪除觀察者兩次
- 10. NSNotificationCenter更改觀察者訂單
- 11. NSNotificationCenter觀察員沒有被刪除?
- 12. NSNotificationCenter觀察員沒有收到通知
- 13. NSNotificationCenter:在Swift中刪除觀察者
- 14. 如何檢索所有NSNotificationCenter觀察者?
- 15. NSNotificationCenter觀察者不起作用
- 16. NSNotificationCenter vs自定義觀察者協議
- 17. NSNotificationCenter刪除錯誤的觀察者?
- 18. 基於塊的NSNotificationCenter觀察子類?
- 19. KVO:無法刪除觀察者
- 20. AVPlayerItem初始timedMetadata不被觀察(KVO)
- 21. 通過KVO觀察MKMapView的區域?
- 22. KVO問題「無法刪除觀察者」
- 23. 刪除KVO觀察者時APP崩潰
- 24. Swift KVO - 觀察枚舉屬性
- 25. 如何移除KVO觀察者?
- 26. 刪除KVO觀察者問題
- 27. 個別觀察鍵的KVO清理
- 28. NSNotificationCenter:添加觀察者,但只有未註冊才能觀察?可以查詢對象的觀察狀態?
- 29. 觀察員可以觀察多個可觀察物嗎?
- 30. 觀察
啊。不知道通知的彙總。這對我來說是相當重要的。 – David
通知最適用於不需要一個對象來了解某些特定其他對象的情況。例如,如果在應用程序中進行了一些設置更改,並且通知這些視圖不必知道管理保留MVC的設置的對象,則可能需要刷新一堆視圖。 –