2

是否有指示功能的塊被同步或異步地調用一個圖案,例如:模式用於指定一個函數的塊是異步的VS同步

- (void)processImage:(UIImage *)image onComplete:(void (^)(NSError *__error))onComplete; 

是將同步處理圖像的功能和然後調用onComplete(error)完成時,但:

- (void)downloadResourceIDs:(NSArray *)imageIDs onComplete:(void (^)(NSError *__error))onComplete; 

是將異步下載的數組指定的資源,並呼籲onComplete(error)一切下載後的功能,但這不是立即明顯ŧ這是一個異步回調。例如,我可以使用dispatch_semaphore中的downloadResourceIDs:onComplete:來防止發生回調,直到下載完成爲止。

或者應該所有函數都是同步的,即使函數本身包含異步元素(如異步下載東西)並且人工強制同步?

+3

如果一個操作是同步執行的,爲什麼要使用一個塊呢?任何在代碼塊中的代碼都可以在方法調用後寫入(並且該方法可以返回一個'BOOL'並帶一個'NSError **'來指示錯誤)? – 2013-04-23 01:19:48

+1

@一二三:在塊最後要運行的情況下,這可能是正確的。在這種情況下,因爲它被稱爲「onComplete」。但是,如果該塊應該在中間運行呢?例如,'enumerateObjectsUsingBlock:'是同步的。 – newacct 2013-04-23 09:10:37

+0

@newacct啊,所以也許這個塊的命名約定是'onComplete','onSuccess','onFailure'暗示異步。 – Shizam 2013-04-23 16:16:20

回答

2

我會建議完成塊足以傳遞異步調用。

對於我的錢,第一個界面是可怕的錯誤。同步調用不需要完成塊,並且在接口中不應該有。

+0

我想你可能在這裏有一個觀點,但我認爲這是答案。 – Shizam 2013-04-23 01:49:38

+0

是的,在這種情況下,我應該做什麼一二三建議哪些是返回一個對象(如有必要)或BOOL(至少)並使用NSError **。 – Shizam 2013-04-23 02:28:22