2017-07-12 38 views
1

我知道已經有很多關於調度隊列,異步任務等的帖子,但是我無法從這些帖子中檢索出有用的解釋,因爲由於額外的代碼太多的分心。我在那裏有人能夠給我一個清楚的指示,說明如何在任務A完成後開始任務B?調度隊列明確解釋

爲了成功運行任務B,我需要來自任務A的一些數據,並且我知道我必須使用DispatchQueue.async做些事情,但我不知道具體如何。

+0

「任務B在任務A之後開始」一個接一個=串行。所以你想要一個串行DispatchQueue(這是默認的)。你想阻止等待A和B完成,還是希望異步調度它們,讓程序繼續而不等待它們完成? – Alexander

+0

@Alexander是的,這是我需要的,我希望其他代碼等待任務A和B,因爲任務A和B收集所有其他編碼所需的所有數據。 –

+0

所以你想同步提交你的任務('.sync'),而不是異步('.async') – Alexander

回答

1

這樣的事情呢?

import Dispatch 

let queue = DispatchQueue(label: "My dispatch queue") //TODO: Give better label 

let result1 = queue.sync { // "Task A" 
    return "result 1" 
} 

let result2 = queue.sync { // "Task B", which uses result from Task A 
    return result1.uppercased() 
} 

print(result2) 
2

典型的過程是與async異步調度到某個串行隊列。所以,讓我們說你想要一些隊列用於處理圖像,做任務A,然後任務B,然後做一些UI更新時,任務B完成後,你可以這樣做:

let queue = DispatchQueue(label: Bundle.main.bundleIdentifier! + ".images") 

queue.async { 
    // do task A 
} 

queue.async { 
    // do task B 
} 

queue.async { 
    // do whatever else is needed after B here 

    DispatchQueue.main.async { 
     // update model objects and UI here 
    } 
} 

這是避免阻塞模式主隊列,但可以確保您連續執行A和B.

請注意,如果任務A或任務B本身是異步的,則上述操作將不起作用。 (如果底層任務是異步的,也不會嘗試使用sync。)其他模式將適用於這些情況。但是你的例子太籠統了,我們可以列舉所有其他可能的模式。如果您具體告訴我們A和B正在做什麼任務,我們可以提供更具建設性的建議。

另請注意,我明確建議不要同步調度(與sync)。使用sync具有一定的直觀吸引力,但它很少是正確的方法。阻塞調用線程(這是sync的作用)很大程度上破壞了首先調度隊列的目的。人們應該使用sync的(很大程度上)唯一原因是如果您試圖對某些共享資源進行線程安全訪問。但是大多數情況下,爲了從當前線程中獲取一些耗時的任務,您明確使用了調度隊列。因此,將A和B async發送到串行隊列,並且如果您想要做其他事情,則在C之後,您也會將該async發送到同一隊列。

有關說明,請參閱Concurrency Programming Guide: Dispatch Queues。這些例子在Objective-C中,但所有的概念都是一樣的。您還可以前往WWDC videos並搜索「GCD」,並且您將獲得一些經過Grand Central Dispatch(更廣泛的調度隊列技術)的視頻。