等待两个NSOperation完成而不阻塞UI线程

时间:2018-11-09 20:14:20

标签: ios concurrency nsoperationqueue nsoperation

我刚刚阅读了NSOperationQueues和NSOperation here的详细介绍。

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

如何等待这2个操作完成然后继续进行计算?我不想阻止UI线程。如果我要执行另一个NSOperation,则主要方法是创建两个NSOperation,将它们添加到某个本地(用于此操作)队列中,并等待waitUntilAllOperationsAreFinished方法。然后继续计算吗?

我不喜欢这种方法,每次创建新操作时都需要创建本地队列。我可以这样设计吗:我可以重用一个队列,但只等待两个本地操作?我可以想象方法waitUntilAllOperationsAreFinished可以等到所有任务都完成后,才能在并行执行许多任务时阻塞。有设计建议吗?创建NSOperationQueue昂贵吗?在iOS中,如果不使用NSOperationNSOperationQueue,还有更好的方法吗?我的目标是iOS 9+设备。

1 个答案:

答案 0 :(得分:0)

在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的出色教程。

相关问题