swift - 串行队列内的并发队列调用?

标签 swift objective-c grand-central-dispatch

在 Objective-C 和 Swift 中,串行队列的异步 block 内并发调用的执行顺序是否有保证?

伪代码:

let serialQueue = SerialQueue()
let concurrentQueue = ConcurrentQueue()

serialQueue.async { // 1
    concurrentQueue.async { // 2
        run_task1() // task that takes 1 hour
    }
}

serialQueue.async { // 3
    concurrentQueue.async { // 4
        run_task2() // task that takes 1 minute
    }
}

在上面的代码中,是否保证任务1在调用任务2之前完成?

或者,由于它们是在并发线程上调用的,串行队列异步仅保证 run_task1 将在 run_task2 之前添加到并发队列>,但不保证执行顺序?

最佳答案

我已经对您问题中的 block 进行了编号,因此我可以在这里引用它们:

block 1 和 block 3 都在串行队列上运行,因此 block 3 仅在 block 1 完成后才会运行。

但是, block 1 和 3 实际上并不等待任务 1/2,它们只是对 block 2 和 4 中异步发生的工作进行排队,这几乎立即完成。

从那时起,任务 1 和 2 将同时运行,并以任意顺序完成。唯一的保证是任务 1 将在任务 2 之前启动。


我总是喜欢用点披萨和做披萨做类比。对异步工作进行排队就像订购披萨一样。这并不意味着您可以立即准备好披萨,并且在披萨店烘烤披萨时您不会被阻止做其他事情。

您的 block 1 和 3 是强顺序的,因此 1 将在 3 开始之前完成并完成。然而,该街区所做的只是订购披萨,而且速度很快。这确实意味着披萨 1(任务 1)在披萨 2(任务 2)之前完成,这只是意味着您在调用第二个电话之前先挂断了第一个电话。

关于swift - 串行队列内的并发队列调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67219631/

相关文章:

ios - 当应用程序未激活时,Swift CNContact 确实发生了变化

swift - Swift 中的批量初始化和协议(protocol)

ios - 向表中插入行时,“尝试将第 0 行插入第 0 节,但更新后第 0 节中只有 0 行”

objective-c - 如何在同步后正确处理 UI 刷新

ios - 延迟后如何触发 block ,例如 -performSelector :withObject:afterDelay:?

ios - 尝试呈现其 View 不在窗口层次结构中的 UIAlertController

iphone - 如何在 iOS 中将 UIImage 保存为渐进式 JPEG 格式?

iphone - 错误 : Creating Tab-Navigation programmatically

objective-c - iOS - 将数组保存到磁盘所需的时间

swift - swift 中 DispatchQueue 类型之间的区别