[翻譯]通訊模式(Communication Patterns)

引言

看到標題的也許有一些老司機看過原文,此文是基於原文翻譯加上本身理解,爲了更好的學習iOS~(文章並無寫如何運用,主要是探討何時用。) 原文地址:https://www.objc.io/issues/7-foundation/communication-patterns/編程

咱們在開發過程當中,經常使用的兩個對象之間的相互通訊的方式有很五種網絡

  • Target-Action
  • Delegation
  • block
  • KVO
  • Notifications 本文是討論各個通訊的使用,以及在何時用這些通訊方式。在通訊的過程當中,每每一個是接收者,一個是發送者。
Target-Action

這個方式相信你們見的就不少了,在寫Button或者手勢的時候,都會用到addTagert這個方法。Target-Action是用於在用戶界面事件響應中發送消息的典型模式,通常是用於處理動做消息。他包含了 兩個數據,一個是選擇子(selector),還有一個是接收人(target)。在iOS中,能觸發Target-Action事件的通常是基於UIControl的(官方文檔說是能夠任何對象,不過基本上都是繼承與UIControl的)。通常的Target-Action的接收事件以下:閉包

-  (void)dosomething:(id)sender;
複製代碼

在Target-Action中,消息的接收者其實並不知道發送者是誰,發送者也不知道消息的接送者是誰。因此當target是nil的時候,會經過響應者鏈找到某一個接收者去響應這個消息。這個方式的缺點就是傳遞消息的時候不能帶着自定義的參數。架構

Delegation

Delegation在蘋果本身的FrameWorks裏就常用,好比咱們常常用的 tableViewdelegatedataSource。它容許咱們去自定義某一個對象的行爲,也能夠(被)告訴咱們這個對象發生了什麼。在這個通訊過程當中,消息的發送者須要知道消息的接收者,也就是這個delegate。咱們在用UITableView的時候每每會寫tableView.delegate = self,就是讓tableView這個消息的發送者知道消息的接收者是誰(self)。這樣的耦合度會很低,你們應該都深有體會吧,哈哈哈,有時候可能會找不到這個方法在哪兒。。。 delegate protocol能夠定義任何方法,因此你也能夠用這些方法傳遞你想要傳遞的參數,並且delegate protocol能夠響應這些方法返回的參數。可見delegate protocol的通訊方式是很是的靈活和直接。函數

block

block也叫閉包函數,講道理的說,只要是Delegation通信模式下能夠作的事情,均可以用block代替。相對來講,block對於代碼的總體性體驗較好,不會散落在各地。可是blokc會形成循環引用,也可能會提早釋放。總之block應用起來,老是對新手那麼的不友好。 block的可以抓取當前上下文的命名域,怎麼說呢,就是你不須要知道這個具體是什麼東西,裏面是怎麼樣的,你能夠直接更具他給的參數或者直接寫你想要寫的代碼。學習

#####KVO KVO是一種通知對象的屬性發生改變的機制。KVO是一種靈活的方式去監聽當前對象屬性的改變,尤爲是對於系統屬性的監聽,好比說UITableViewContentOffSet這個值改變的監聽,能夠幫咱們實現一些比較酷炫的UI效果(你懂的)。 KVO的使用,須要一些必要的條件,好比說你的對象要支持Key-Value Observing機制。並且你要知道這個對象的生命週期,在你不須要的時候移除這個KVO觀察。spa

Notifications

Notifications這通信方式,就是一種很好的,系統給咱們封裝好的,一對多的廣播。他最大的優點就是能夠跨越層級,對代碼架構的解耦頗有幫助。(如今好像不能說一對可能是他的優點了,貌似Swift裏有多Delegate) iOS系統在應用過程當中會發不少通知,好比說UIKeyboardWillShowNotificationUITextViewTextDidChangeNotification等等各類。 NotificationsKVO同樣,須要知道接收者的生命週期,在最後生命週期結束的時候註銷這個NotificationsiOS大部分的生命週期結束的時候都會調用- (void)dealloc。因此其實用起來也比較簡單。(固然你要是發生循環引用致使當前對象不能釋放,那就沒辦法了(⊙﹏⊙)b)。翻譯

討論

對比了這五種方式,那咱們何時用呢。上面文章的做者給了這麼一張圖:設計

通信模式.png

我想分享下本身對於通信模式的見解。由於不會畫圖,畫在紙上的話,字太醜了,就寫文字吧。。。。 1.是否直接進行對象的交互並且不須要參數,好比說手勢,Button這些的 。若是是的話,就用Target-Action。 2.是不是多層級的,兩個對象是否有聯繫,若是不是的話,就能夠用Notifications。 3.既然兩個對象是有聯繫的,當你須要監聽值發生變化的時候,可使用KVO。(單存值變化,而不是其餘動做響應的狀況下) 4.我是否須要知道這個對象的具體東西,上下文的具體命名域。若是不須要的話,這個時候使用Block會好一點。好比說咱們網絡請求時候的回調各類,只要輸入請求參數,而後寫好回調。中間發生了什麼,其實你知道不知道,並不影響使用。 5.對於Delegationblock我以爲是大部分狀況下是能夠互相替換的,由於關於循環引用這方面,如今各類WeakSelf,StrongSelf的文章。不過在某些狀況,好比說你的消息發送者須要用到接收者給的返回值的時候,這個時候用Delegation在設計上來講比Block更好。code

End

其實對於通信模式這種理解,對於總體架構,包括響應式編程都有很好的幫助。

相關文章
相關標籤/搜索