我知道已經有很多關於調度隊列,異步任務等的帖子,但是我無法從這些帖子中檢索出有用的解釋,因爲由於額外的代碼太多的分心。我在那裏有人能夠給我一個清楚的指示,說明如何在任務A完成後開始任務B?調度隊列明確解釋
爲了成功運行任務B,我需要來自任務A的一些數據,並且我知道我必須使用DispatchQueue.async做些事情,但我不知道具體如何。
我知道已經有很多關於調度隊列,異步任務等的帖子,但是我無法從這些帖子中檢索出有用的解釋,因爲由於額外的代碼太多的分心。我在那裏有人能夠給我一個清楚的指示,說明如何在任務A完成後開始任務B?調度隊列明確解釋
爲了成功運行任務B,我需要來自任務A的一些數據,並且我知道我必須使用DispatchQueue.async做些事情,但我不知道具體如何。
這樣的事情呢?
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)
典型的過程是與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(更廣泛的調度隊列技術)的視頻。
「任務B在任務A之後開始」一個接一個=串行。所以你想要一個串行DispatchQueue(這是默認的)。你想阻止等待A和B完成,還是希望異步調度它們,讓程序繼續而不等待它們完成? – Alexander
@Alexander是的,這是我需要的,我希望其他代碼等待任務A和B,因爲任務A和B收集所有其他編碼所需的所有數據。 –
所以你想同步提交你的任務('.sync'),而不是異步('.async') – Alexander