Как использовать 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)

1 ответ

Если вы хотите запускать операции последовательно, вы должны ограничитьmaxConcurrentOperationCountочереди на 1. Это гарантирует, что только одна операция будет выполняться одновременно.

Кроме того, заканчивается, как только все блоки вернулись, например, как только вашasyncFunc1иasyncFunc2функция возвращает вашBlockOperationсигнализирует о завершении. Итак, если внутри вашей асинхронной функции вы вызываете любойURLSessionTaskоперация завершится до завершения задачи. Вы должны создать свою собственную асинхронную операцию, унаследовавOperationкласс и переопределениеisAsynchronousсвойство и сигнализировать о завершении операции вручную, когда ваши внутренние асинхронные задачи завершатся.

Другие вопросы по тегам