2012-02-27 26 views
8

如果塊必須等到主線程結束,爲什麼有人會使用dispatch_sync。使用這個函數有什麼好處,而不是在線編寫代碼(在Grand Central Dispatch之外的非塊和代碼)。我可能會誤解dispatch_sync實際上做了什麼。謝謝。如果必須等到主線程完成,才使用dispatch_sync有什麼好處?

+1

可能的重複:http://stackoverflow.com/questions/4607125/usage-of-dispatch-sync-in-grand-central-dispatch – UIAdam 2012-02-27 20:02:54

回答

7

dispatch_sync做了你的想法 - 它將塊發佈到指定隊列並阻塞當前隊列,直到塊被執行。主要的隊列/線程不是特別牽扯,除非你調度它或從它。

因此,如果必須在不同的隊列/線程上執行操作(例如SQLite或OpenGL操作),您通常會使用它,但是您需要操作的結果或只需知道操作已完成功能條款。

模式:

dispatch_async(otherQueue, 
    ^{ 
      id result = doHardTask(); 

      dispatch_async(originalQueue, 
       ^{ 
        didGetResult(result); 
       }); 
    }); 

是更好的做法,但不是真正的東西,你可以只粘上底。

+0

哦,所以當你提名一個隊列時,這確實是一個輔助隊列(即不是我的應用程序的主隊列,並且不會導致鎖定)。所以,如果我使用所有的dispatch_sync塊,我仍然可以在輔助線程上運行。那對嗎? – Ryan 2012-02-27 21:10:31

+1

dispatch_sync有效地將塊的時間成本添加到兩個隊列中,而不是一個(雖然處理只發生一次)。所以你不會在你的主線程中使用'dispatch_sync'獲得固有的用戶交互優勢。 – Tommy 2012-02-27 22:33:56

0

您可以使用dispatch_async啓動併發隊列,並在與該調用相關聯的塊內使用dispatch_sync在第二個隊列上啓動一系列任務。這將全部發生而不阻塞主隊列。

+0

是否有任何意見使用dispatch_sync,如果我使用所有dispatch_sync雖然?我正在查看某人的代碼,這就是他們使用的所有內容。似乎你可以在沒有塊的情況下做同樣的事情。沒有? – Ryan 2012-02-27 20:18:28

+0

Offmy,我想不出在dispatch_async調度塊之外使用dispatch_sync的場合,正如Tommy的代碼所說明的那樣。 – 2012-02-28 00:10:07

相關問題