Выполняйте асинхронные методы по одному в цикле, Swift 4 - PullRequest
1 голос
/ 09 марта 2019

Мне нужны методы executeAsyncRequests (для каждого i) до завершения следующего (i + 1).Я пытаюсь это:

let group = DispatchGroup()
let queue = OperationQueue()
queue.maxConcurrentOperationCount = 1

for i in 0..<results.count {
    group.enter()
    print("\(i)-async started")
    queue.addOperation {
        print("Operation \(i) added")
        self.performAsyncRequests(completion: { (result) in
            print("Request \(i) completed")
            group.leave()
        })
    }
}
group.notify(queue: .main) {
    print("All requests completed")
    self.reloadTableView()
}

Но это выполняет несколько запросов одновременно.Цените, если кто-то может направить меня в правильном направлении.

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

Самым простым решением является написание подпрограммы, которая рекурсивно выполняет запросы, например:

func performNextRequest(_ index: Int = 0) {
    guard index < results.count else {
        DispatchQueue.main.async {
            // initiate whatever you want when this is done
            self.reloadTableView()
        }
        return
    }

    performAsyncRequest(index) { [weak self] in
        self?.performNextRequest(index + 1)
    }
}

Более элегантным решением является использование некоторого асинхронного шаблона, такого как асинхронный подкласс Operation или обещания.

0 голосов
/ 09 марта 2019

DispatchGroup - неправильный API.Я удостоверяюсь, что закрытие notify не вызывается до завершения последней операции независимо от порядка выполнения.

Возможное решение - асинхронный Operation в сочетании с не-конкурентная очередь.

...