iOS原生KVO有諸多缺點。安全
1. 須要手動在dealloc中移除觀察者,不然會crash。重複remove,也會crashapp
2. 複寫的觀察者方法。post
3. 觀察多個對象時,須要在方法中if else判斷ui
4. 經過context判斷上下文spa
FB開源的KVOController完美的解決了上述的問題線程
FBKVOController:負責管理Observer(觀察者)和Subject(被觀察者)。其中lock保證FBKVOController的線程安全cdn
_FBKVOInfo:保存KVO相關的全部信息;keyPath,option,context,_block,state。複寫了isEqual:和hash方法,使用keyPath來判斷。server
_FBKVOSharedController:單例。實現系統KVO的方法,本身做爲observer,監聽subject,並從FBKVOInfo中取出subject的信息。負責最後的監聽的實現對象
參考:blog
1. 如何優雅地使用 KVO