2011-10-20 61 views
1

中塊的用處我最近一直在試圖理解塊在編程中的重要性(尤其是Objective-C)。他們顯然在iOS/Cocoa API中使用很多,所以我試圖理解它們。請解釋Objective-C

大多數情況下,我仍不明白爲什麼要使用塊而不是創建單獨的幫助函數。例如,如果我創建了一個實現了一些排序函數的塊,那麼創建該函數作爲助手類的方法不是更容易嗎,因此代碼中的所有對象都可以更容易地使用它嗎?

+3

如果您的排序功能是一次性的,而不是在其他地方使用,該怎麼辦?您將通過使用塊來最小化代碼的表面積並增加代碼的局部性。 –

回答

2

塊是一個不錯的選擇,回調或代表,如果沒有別的比精益求精代碼的可讀性您的調用代碼的本地業務邏輯。

但是它們非常多:對異步性非常有用,而且如果您想要使用GCD來提高性能,這種需求就很大。

除了蘋果的官方文檔,我強烈推薦閱讀Mike Ash出色的Practical Blocks

+0

我認爲「保持業務邏輯侷限於調用代碼」的想法是我被絆倒的地方。如果您需要重用業務邏輯呢?不要靠近代碼,不要使用它的可重用性? – chrismanderson

+2

塊不會阻止您將可重用代碼重構爲公共或私有助手,但它們可以幫助增加代碼簡潔性並以互補方式重用。假設你重構了一些包含對'myNewHelperMethod:(id)obj'異步操作的可重用代碼。現在假設你希望你的調用對象在輔助完成後做些事情。你可以使用委託或NSNotifications,但是這兩者都是相當重量級的,並且控制流是泥濘的。相反,你可以讓你的助手從調用者接收一個塊:'mynewHelperMethod:(id)obj withCompletionBlock:^(id obj)aBlock' – followben

2

塊的一個很好的功能是它們可以用在任何可以使用對象的地方,所以你可以將數據塊存儲在數組或字典中。另一個有趣的事情是,你可以在對象內或對象的方法參數之間傳遞塊,例如:

- (void)processDataWithBlock:(void (^)(void))block 
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations 

第二種方法是連UIView API。有人可能會爭辯說函數指針會在這裏做,但這會更復雜,不夠靈活和不連貫。此外,塊可以訪問局部變量和實例變量,而不用將它們作爲參數傳遞。

這是我的2美分的視圖塊用戶角度出發的,但我沒有一個專家的...