2017-01-30 126 views
0

對於主管人員:在我決定詢問 這個問題之前,我已經搜查了很多,但是我沒有找到我想要的東西。通知中心或關閉?

我的問題是:這是使用NotificationCenter和使用Closures兩個實例之間的通信之間的更好? 如果它們相似,應該使用什麼?

希望這個例子可以幫助您更好地瞭解: -

如果我們把URLSession類爲例。爲什麼它的大部分方法都會關閉?爲什麼他們不在裏面發送Data, Response, and Error的通知?

我知道他們之間的區別,我只是不知道在什麼情況下我應該使用每一個。

+0

你的意思是回調反對封閉? –

+0

@RyanH。我的意思是:如果我總是能夠通過使用閉包實現相同的結果,那麼我應該在什麼情況下或在什麼情況下使用通知中心(發佈和觀察通知)。 – 3li

回答

2

在一些情況下,圖案是可以互換的,但是:

  1. 使用閉合爲簡單的情況下
  2. 使用委託是常見當存在兩個對象之間複雜的通信的最簡單的解決方案。一個代表可能比許多關閉更好。
  3. 當你有多個觀察者或者你不確定什麼對象將被觀察時,你必須使用通知。

您可能會問自己,爲什麼我們在簡單情況下使用閉包而不是委託或通知。答案是閉包是最輕量級的。它們很容易創建,它們對你的代碼質量有積極的影響。

讓我們考慮一個完成回調。如果您決定使用通知,則需要另一種處理該通知的方法。代表同樣有效。如果您需要一些上下文(例如觸發操作的參數),則需要將其保存到屬性中。

另一方面,封閉可以創建內聯。這意味着觸發動作並處理其結果的代碼位於的一個位置。這真的簡化了代碼的結構。還要注意,如果閉包需要一些上下文,它可以捕獲它,而不需要創建額外的屬性。

+0

謝謝你的幫助。您能否詳細解釋一下「簡單案例」和「複雜交流」的含義? – 3li

+1

@ 3li一個簡單的例子是一個完成回調(即,發送給觀察者的信息很簡單 - 例如一個結果對象,它只被調用一次)。如果你看看'UITableView'代表,你會看到一個複雜通信的例子。您有20次可以多次調用的回調函數(例如'didSelect')。這樣做使用多個閉包將非常複雜。不是不可能,只是複雜。關閉是輕量級的,最容易使用,但一旦對象之間的交互變得過於複雜,那麼委託就是答案。 – Sulthan

+0

啊哈,我現在明白了。非常感謝! ❤️ – 3li