Ожидание завершения двух NSOperation без блокировки потока пользовательского интерфейса - PullRequest
0 голосов
/ 09 ноября 2018

Я только что прочитал длинное введение в NSOperationQueues и NSOperation здесь .

Мой вопрос следующий. Мне нужно запустить две операции одновременно. Когда обе эти задачи завершены, мне нужно сделать еще один расчет на основе результатов двух завершенных операций. Если одна из операций завершается неудачей, вся операция также должна завершиться неудачей. Эти две операции не имеют зависимостей и полностью независимы друг от друга, поэтому мы можем запускать их параллельно.

Как дождаться окончания этой 2 операции и затем продолжить вычисления? Я не хочу блокировать поток пользовательского интерфейса. Если я сделаю еще одну NSOperation, то основным методом будет создание двух NSOperations, добавьте их в некоторую локальную (для этой операции) очередь и подождите с методом waitUntilAllOperationsAreFinished. Тогда продолжить расчеты?

Мне не нравится в этом подходе необходимость создавать локальную очередь каждый раз, когда я создаю новую операцию. Могу ли я спроектировать его так, чтобы я мог повторно использовать одну очередь, но ждать только двух локальных операций? Я могу представить, что метод waitUntilAllOperationsAreFinished может подождать, пока все задачи не будут выполнены, поэтому он будет блокироваться, когда много задач будет выполняться параллельно. Любой совет дизайна? Создание NSOperationQueue дорого? Есть ли лучшие способы сделать это в iOS без использования NSOperation & NSOperationQueue? Я использую устройства iOS 9+.

1 Ответ

0 голосов
/ 10 ноября 2018

В 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
}

И есть отличный учебник по GCD от raywenderlich.com .

...