【问题标题】:Waiting for two NSOperation to finish without blocking UI thread等待两个 NSOperation 完成而不阻塞 UI 线程
【发布时间】:2018-11-09 20:14:19
【问题描述】:

我刚刚阅读了关于 NSOperationQueues 和 NSOperation here 的长篇介绍。

我的问题如下。我需要同时运行两个操作。当这两项任务都完成后,我需要根据两个已完成操作的结果进行另一次计算。如果其中一项操作失败,那么整个操作也应该失败。这两个操作没有依赖关系,彼此完全独立,因此我们可以并行运行它们。

如何等待这 2 个操作完成然后继续计算?我不想阻止 UI 线程。我是否应该创建另一个 NSOperation 主方法正在创建两个 NSOperation 将它们添加到某个本地(对于此操作)队列并使用 waitUntilAllOperationsAreFinished 方法等待。然后继续计算?

我不喜欢这种方法,每次创建新操作时都需要创建本地队列。我可以这样设计吗,我可以重用一个队列但只等待两个本地操作?我可以想象waitUntilAllOperationsAreFinished 方法可以等到所有任务都完成,所以当很多任务将并行执行时它会阻塞。有什么设计建议吗?创建NSOperationQueue 成本高吗?在不使用NSOperationNSOperationQueue 的情况下,有没有更好的方法在iOS 中做到这一点?我的目标是 iOS 9+ 设备。

【问题讨论】:

  • 别等了。使用DispatchGroupnotify 你甚至可能不需要NSOperation;在并发队列上分派两个函数可能就足够了
  • 这符合@Paulw11 所写的内容:stackoverflow.com/questions/41412780/…
  • 看起来它是为我的问题而设计的。我只是在互联网上找不到任何示例,这些示例在通知块中重用了来自单个任务的一些计算对象。每个示例都是基于print() 的东西而没有交换数据。谢谢你们让我注意到这一点。我根本不知道 DispatchGroup。

标签: ios concurrency nsoperationqueue nsoperation


【解决方案1】:

在 Swift 4 中,你可以这样做:

let group = DispatchGroup()
// async
DispatchQueue.global().async {
    // enter the group
    group.enter()
    taskA(onCompletion: { (_) in
        // leave the group
        group.leave()
    })
    group.enter()
    taskB(onCompletion: { (_) in
        group.leave()
    })
}

group.notify(queue: DispatchQueue.main) {
    // do something on task A & B completion
}

还有来自raywenderlich.com 的关于 GCD 的优秀教程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    相关资源
    最近更新 更多