调度队列清晰解释

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(调度队列技术的更广泛术语)的精彩视频。