【问题标题】:Dispatch queue clear explanation调度队列清除说明
【发布时间】:2017-07-12 17:15:33
【问题描述】:

我知道已经有很多关于调度队列、异步任务等的帖子,但是我无法从这些帖子中找到有用的解释,因为额外的代码让我分心了。我有谁能给我一个关于如何在任务 A 完成后开始任务 B 的明确指示?

我需要任务 A 的一些数据才能成功运行任务 B,我知道我必须对 DispatchQueue.async 做一些事情,但我不知道具体如何。

【问题讨论】:

  • “任务 B 在任务 A 之后开始”一个接一个 = 串行。因此,您需要一个串行 DispatchQueue(这是默认设置)。您是要阻塞等待 A 和 B 完成,还是要异步调度它们,让您的程序在不等待它们完成的情况下继续运行?
  • @Alexander 是的,这就是我需要的,我希望其他代码等待任务 A 和 B,因为任务 A 和 B 收集所有其他编码所需的所有数据。
  • 那么您希望同步提交任务 (.sync),而不是异步提交 (.async)
  • @Rob“收集所有其他编码所需的所有数据”给我的印象是他想等到这一切都完成后再继续。
  • @Rob 我会将整个过程(A 然后 B)放在异步调用上,然后在其中同步调用它们。它可以防止你需要疯狂数量的嵌套完成处理程序

标签: swift3 grand-central-dispatch dispatch dispatch-async


【解决方案1】:

典型的过程是使用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。这些示例在 Objective-C 中,但所有概念都是相同的。您也可以转到WWDC videos 并搜索“GCD”,您将获得许多介绍 Grand Central Dispatch(调度队列技术的广义术语)的精彩视频。

【讨论】:

    【解决方案2】:

    这样的事情怎么样?

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多