2

我是一名普通的iOS開發人員。我首先看到的第一個設計模式是使用委託模式,它主要用於回調功能。塊可以通過目標C中的協議替換委託模式嗎?

既然目標C中有塊,並且我看到越來越多的庫大量使用它們並避免委託,我想知道,塊是否永久替代使用協議的委託模式?

我最近在一個項目中使用了MKNetworkKit,我在它上面創建了一個包裝類,這個庫是基於塊的,所以我所有的代碼將封裝一個基於塊的代碼調用變成另一個基於塊碼。

我發現,這是很方便的開始,但難以調試和修改的代碼看起來複雜(回調回調裏面裏面回調!)

何時使用什麼和某些最佳實踐有什麼建議?

+1

這個問題更適合http://programmers.stackexchange.com – rmaddy

+0

雅,但我也看到了很多像這樣的問題。所以我傾向於困惑。 –

+0

這是我剛發現的一篇很好的文章,它解釋了何時使用塊或委派是一個好主意。換句話說,這兩種方法都是有效的方法,但是根據您編寫的特定環境/代碼類型,您使用哪一種方法是不同的。 http://stablekernel.com/blog/blocks-or-delegation/ –

回答

4

代表和塊都用於「回調」結果,通常用於創建它的東西。有一些區別:

  • 使用委託協議,您必須實現接收回調的方法名是固定的。這意味着,如果您需要使用相同的代理協議接收來自多個可能操作的回調,則必須以某種方式區分它們。有塊,沒有固定的名字;你只需傳遞一個具有特定簽名的塊對象。您可以將不同的塊對象傳遞給不同的操作。
  • 委託協議通常(但不總是)包含多種回調方法,例如,一個「成功」和一個「失敗」回調。每個塊只能作爲一個回調。許多庫試圖通過使用多個參數來將多個委託回調「組合」爲一個塊回調。該塊有兩個參數(結果,錯誤),其中如果「錯誤」爲零,則它對應於原始的「成功」回調,其中「結果」是數據;如果「錯誤」不是零,則它對應於原始的「失敗」回調。另一個選擇是將多個塊分別賦予該動作(例如,它具有「成功塊」屬性和可以設置的「失敗塊」屬性)。這是比較一般的,並且可以通過任意數量的方法作爲代理協議的一對一替換。
  • 內存管理:委託通常是弱引用的,因爲委託通常是擁有委託者的「父」對象。然而,塊被強烈引用,因爲塊是一次性使用的東西,一旦傳遞給委託人就不再需要了。但是,如果你考慮一下,這並沒有什麼不同。對於委託,委託方法通常會對其自身(父對象)執行一些操作。通過塊,爲了做到這一點,塊需要引用「父」。那麼這個引用需要是一個弱引用,來模擬委託模式的內存管理。通過塊,父目標代碼可以更好地控制委託人如何引用它,因爲它設置了塊。

總之,可以使用委託協議將任何API系統地轉換爲使用塊的塊,使用上面描述的塊 - 對於每個委託方法,在委託人上添加一個塊屬性。

0

他們談論的協議和指定的delegate objectsblock-based code完全不同,後者通常用於封裝任務和/或將其交付給GCD。

我確實看到了蘋果的一個似乎符合一些功能,與會代表提供數據塊文件在同一個地方:

塊,因爲該塊進行 兩個密碼被執行,則作爲回調特別有用在回調和 執行期間需要的數據。