看到標題的也許有一些老司機看過原文,此文是基於原文翻譯加上本身理解,爲了更好的學習iOS~(文章並無寫如何運用,主要是探討何時用。) 原文地址:https://www.objc.io/issues/7-foundation/communication-patterns/編程
咱們在開發過程當中,經常使用的兩個對象之間的相互通訊的方式有很五種網絡
這個方式相信你們見的就不少了,在寫Button或者手勢的時候,都會用到addTagert
這個方法。Target-Action是用於在用戶界面事件響應中發送消息的典型模式,通常是用於處理動做消息。他包含了 兩個數據,一個是選擇子(selector),還有一個是接收人(target)。在iOS中,能觸發Target-Action事件的通常是基於UIControl的(官方文檔說是能夠任何對象,不過基本上都是繼承與UIControl的)。通常的Target-Action的接收事件以下:閉包
- (void)dosomething:(id)sender;
複製代碼
在Target-Action中,消息的接收者其實並不知道發送者是誰,發送者也不知道消息的接送者是誰。因此當target
是nil的時候,會經過響應者鏈找到某一個接收者去響應這個消息。這個方式的缺點就是傳遞消息的時候不能帶着自定義的參數。架構
Delegation在蘋果本身的FrameWorks
裏就常用,好比咱們常常用的 tableViewdelegate
和dataSource
。它容許咱們去自定義某一個對象的行爲,也能夠(被)告訴咱們這個對象發生了什麼。在這個通訊過程當中,消息的發送者須要知道消息的接收者,也就是這個delegate
。咱們在用UITableView
的時候每每會寫tableView.delegate = self
,就是讓tableView
這個消息的發送者知道消息的接收者是誰(self
)。這樣的耦合度會很低,你們應該都深有體會吧,哈哈哈,有時候可能會找不到這個方法在哪兒。。。 delegate protocol
能夠定義任何方法,因此你也能夠用這些方法傳遞你想要傳遞的參數,並且delegate protocol
能夠響應這些方法返回的參數。可見delegate protocol
的通訊方式是很是的靈活和直接。函數
block
也叫閉包函數,講道理的說,只要是Delegation
通信模式下能夠作的事情,均可以用block
代替。相對來講,block
對於代碼的總體性體驗較好,不會散落在各地。可是blokc
會形成循環引用,也可能會提早釋放。總之block
應用起來,老是對新手那麼的不友好。 block
的可以抓取當前上下文的命名域,怎麼說呢,就是你不須要知道這個具體是什麼東西,裏面是怎麼樣的,你能夠直接更具他給的參數或者直接寫你想要寫的代碼。學習
#####KVO KVO
是一種通知對象的屬性發生改變的機制。KVO
是一種靈活的方式去監聽當前對象屬性的改變,尤爲是對於系統屬性的監聽,好比說UITableView
的ContentOffSet
這個值改變的監聽,能夠幫咱們實現一些比較酷炫的UI效果(你懂的)。 KVO
的使用,須要一些必要的條件,好比說你的對象要支持Key-Value Observing機制。並且你要知道這個對象的生命週期,在你不須要的時候移除這個KVO
觀察。spa
Notifications
這通信方式,就是一種很好的,系統給咱們封裝好的,一對多的廣播。他最大的優點就是能夠跨越層級,對代碼架構的解耦頗有幫助。(如今好像不能說一對可能是他的優點了,貌似Swift裏有多Delegate) iOS
系統在應用過程當中會發不少通知,好比說UIKeyboardWillShowNotification
,UITextViewTextDidChangeNotification
等等各類。 Notifications
和KVO
同樣,須要知道接收者的生命週期,在最後生命週期結束的時候註銷這個Notifications
。iOS
大部分的生命週期結束的時候都會調用- (void)dealloc
。因此其實用起來也比較簡單。(固然你要是發生循環引用致使當前對象不能釋放,那就沒辦法了(⊙﹏⊙)b)。翻譯
對比了這五種方式,那咱們何時用呢。上面文章的做者給了這麼一張圖:設計
我想分享下本身對於通信模式的見解。由於不會畫圖,畫在紙上的話,字太醜了,就寫文字吧。。。。 1.是否直接進行對象的交互並且不須要參數,好比說手勢,Button這些的 。若是是的話,就用Target-Action
。 2.是不是多層級的,兩個對象是否有聯繫,若是不是的話,就能夠用Notifications
。 3.既然兩個對象是有聯繫的,當你須要監聽值發生變化的時候,可使用KVO
。(單存值變化,而不是其餘動做響應的狀況下) 4.我是否須要知道這個對象的具體東西,上下文的具體命名域。若是不須要的話,這個時候使用Block
會好一點。好比說咱們網絡請求時候的回調各類,只要輸入請求參數,而後寫好回調。中間發生了什麼,其實你知道不知道,並不影響使用。 5.對於Delegation
和block
我以爲是大部分狀況下是能夠互相替換的,由於關於循環引用這方面,如今各類WeakSelf
,StrongSelf
的文章。不過在某些狀況,好比說你的消息發送者須要用到接收者給的返回值的時候,這個時候用Delegation
在設計上來講比Block
更好。code
其實對於通信模式這種理解,對於總體架構,包括響應式編程都有很好的幫助。