2012-02-08 102 views
18

我讀的調度隊列中的文檔的GCD,並在其中他們說,隊列是FIFO,所以我woundering什麼影響這對異步/同步調度?大中央調度異步VS同步

從我的理解異步的,因爲它得到的東西,而同步執行的東西串行順序執行的東西..

但是當你寫你的GCD的代碼,你決定在哪些事情發生的順序..所以只要你的知道什麼在你的代碼,你應該知道哪些東西的執行順序回事..

我的問題是,哪來的異步這裏的好處?我在理解這兩件事情時錯過了一些東西。

回答

12

同步意味着函數將阻止當前線程,直到它已經完成,異步意味着它將在後臺被處理和功能將不會阻止當前線程。

如果你想塊串行執行檢查串行調度隊列

+0

啊是啊,是清除它的很酷的感謝。是的,我正在使用串行隊列..我只是不確定現在我的好處在哪裏。謝謝。 – 2012-02-08 20:18:26

24

創建的第一個答案是不夠全面,很遺憾。是的,同步會阻止,異步不會,但是還有其他語義要考慮。調用dispatch_sync()也會導致您的代碼等待,直到該隊列上的每個待處理項都已完成執行,並使其成爲該工作的同步點。 dispatch_async()將只需提交工作到隊列並立即返回後,它會被執行「在某個時候」,你需要平時通過嵌套另一個dispatch_async內一個dispatch_async來跟蹤工作,在一些其他的方式(完成 - 見例如手冊頁)。

+0

感謝您的回答。它現在變得更有意義了。 – 2012-02-09 22:23:47

6

從手冊頁:

基本面

Conceptually, dispatch_sync() is a convenient wrapper around 
dispatch_async() with the addition of a semaphore to wait for completion 
of the block, and a wrapper around the block to signal its completion. 
See dispatch_semaphore_create(3) for more information about dispatch sem- 
aphores. The actual implementation of the dispatch_sync() function may be 
optimized and differ from the above description. 
1

任務可以同步或異步執行。

Synchronous函數只有在任務完成後才返回當前隊列上的控件。它阻塞隊列並等待任務完成。

異步函數在任務已發送到不同的隊列上執行後立即返回當前隊列上的控制權。它不會等到任務完成。它不會阻塞隊列。

僅異步我們可以添加延遲 - >asyncAfter(deadline: 10..