如何将OperationQueue与异步函数一起使用?

dev*_*OP1 5 asynchronous swift operationqueue

我需要运行多个函数,并且函数的执行顺序非常重要。我有两个需要运行的非异步函数,然后需要运行两个异步函数。所有函数必须在前一个函数完成后执行。

到目前为止我有以下内容。但是,异步函数似乎并不遵循我所列出的依赖关系。队列开始后,两个异步函数都会立即执行。

我有什么遗漏的吗?任何帮助表示赞赏!:)

let queue = OperationQueue()


let operation1 = BlockOperation {
    nonAsyncFunc1()
}
let operation2 = BlockOperation {
    nonAsyncFunc2()
}
let operation3 = BlockOperation {
    asyncFunc1()
}
let operation4 = BlockOperation {
    asyncFunc2()
}
                                    
operation2.addDependency(operation1)
operation3.addDependency(operation2)
operation4.addDependency(operation3)
                    
self.queue.addOperation(operation1)
self.queue.addOperation(operation2)
self.queue.addOperation(operation3)
self.queue.addOperation(operation4)
Run Code Online (Sandbox Code Playgroud)

Sou*_*unt 0

如果要串行运行操作,则必须将maxConcurrentOperationCount队列的值限制为 1。这将确保一次仅执行一项操作。

此外,BlockOperation一旦所有块返回,例如当您的asyncFunc1and asyncFunc2函数返回您的BlockOperation信号完成时,就会完成。因此,如果在异步函数内调用任何URLSessionTask操作,该操作将在任务完成之前完成。您必须通过继承Operation类并重写isAsynchronous属性来创建自己的异步操作,并在内部异步任务完成时手动发出操作完成信号。