Objective-C結(jié)合RAC實現(xiàn)KVO廣播功能

如果不想看下面的文字,看這里:示例代碼

如果需要監(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)聽屬性的變化:

監(jiān)聽token的變化

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

2.注冊監(jiān)聽方法:

注冊監(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ù),如果有更棒的主意,請留言。

最后編輯于
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 一、概述 筆者 強烈推薦 大家在閱讀本文之前,還請先移步閱讀?? iOS 關(guān)于MVC和MVVM設(shè)計模式的那些事 和...
    CoderMikeHe閱讀 15,832評論 28 147
  • 上半年有段時間做了一個項目,項目中聊天界面用到了音頻播放,涉及到進度條,當(dāng)時做android時候處理的不太好,由于...
    DaZenD閱讀 3,096評論 0 26
  • 其實,我們都是自卑的。 曾經(jīng)的我,就是靦腆又自卑。 從小學(xué)到高中,我的成績都只是班上中上水平,屬于順其自然,野蠻生...
    一肆閱讀 655評論 5 12
  • 表現(xiàn)形式 縱向設(shè)定padding:x y可以橫向縱向拉伸盒子
    c59ffede9db6閱讀 155評論 0 0

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