如果不想看下面的文字,看這里:示例代碼
如果需要監(jiān)聽對象A屬性B值的變化,我們通常會考慮用KVO來實現(xiàn),facebook開源了一個庫簡化KVO監(jiān)聽與移除監(jiān)聽的流程:
https://github.com/facebook/KVOController
試想一下,如果有很多很多地方需要監(jiān)聽對象A屬性B值的變化呢?方法有很多,我隨便說說:
1.在這個對象A屬性B的setter方法里post消息,需要監(jiān)聽的地方接受監(jiān)聽消息。
2.每一個需要監(jiān)聽的地方進行KVO代碼編寫,觀察對象A屬性B值的變化。
3.創(chuàng)建一個觀察者來來監(jiān)聽對象A屬性B值的變化,然后通過回調(diào)廣播出去。
當(dāng)然,還有一些其他的設(shè)計模式都可以實現(xiàn)這個功能。我這里講講第3點我的實現(xiàn)思路。
1.監(jiān)聽屬性的變化:

這段代碼的作用就是使用RAC來觀察token的變化,如有變化,就通過block的方式廣播給所有需要監(jiān)聽的對象。監(jiān)聽放到Appdelegate或者其他比較早運行模塊都行。
2.注冊監(jiān)聽方法:

注釋寫得很清楚了,每個對象只注冊1次,對象銷毀前移除監(jiān)聽。需要說明的是,對象與回調(diào)的關(guān)聯(lián)使用的是對象內(nèi)存地址與block,如果直接使用對象,就算傳參是weakSelf,在添加到array的時候retainCount加1,在RAC釋放那里就不執(zhí)行了,造成內(nèi)存泄漏。
3.注冊與移除注冊代碼實現(xiàn):

? 4.使用示例:

講完了,我不喜歡啰里八嗦,就是分享一個思路,就像REST/AJAX一樣沒啥新技術(shù),如果有更棒的主意,請留言。