调度队列清晰解释
Dispatch queue clear explanation
我知道已经有很多关于调度队列、异步任务等的帖子,但我无法从这些帖子中检索到有用的解释,因为额外的代码有太多干扰。我有人可以给我一个关于如何在任务 A 完成后开始任务 B 的明确说明吗?
我需要任务 A 的一些数据才能成功 运行 任务 B,我知道我必须用 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,然后在任务 B 完成后执行一些 UI 更新,您可以这样做:
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. The examples are in Objective-C, but all the concepts are the same. You can also go to WWDC videos 并搜索 "GCD",您将获得许多介绍 Grand Central Dispatch(调度队列技术的更广泛术语)的精彩视频。
我知道已经有很多关于调度队列、异步任务等的帖子,但我无法从这些帖子中检索到有用的解释,因为额外的代码有太多干扰。我有人可以给我一个关于如何在任务 A 完成后开始任务 B 的明确说明吗?
我需要任务 A 的一些数据才能成功 运行 任务 B,我知道我必须用 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,然后在任务 B 完成后执行一些 UI 更新,您可以这样做:
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. The examples are in Objective-C, but all the concepts are the same. You can also go to WWDC videos 并搜索 "GCD",您将获得许多介绍 Grand Central Dispatch(调度队列技术的更广泛术语)的精彩视频。