Попытка запустить неограниченное количество одновременных задач опасна, поскольку в GCD очень ограниченное количество рабочих потоков, и если вы их исчерпаете, вы можете отрицательно повлиять на другие операции в приложении.
Итакрассмотрим ваш пример:
let concurrentQueue = DispatchQueue(label: "com.company.concurrent", attributes: .concurrent)
for i in 0 ..< 10_000 {
concurrentQueue.async {
self.getMissingImage(self.user[i])
}
}
Вы можете использовать OperationQueue
, который позволяет легко ограничивать степень параллелизма, в этом примере не более 4 одновременно:
let queue = OperationQueue()
queue.name = "com.company.concurrent"
queue.qualityOfService = .userInitiated
queue.maxConcurrentOperationCount = 4
for i in 0 ..< 10_000 {
queue.addOperation {
self.getMissingImage(self.user[i])
}
}
Youможет выполнить нечто подобное с семафорами GCD, но это немного более хрупко, и я бы предложил выше.
Обратите внимание, это предполагает, что getMissingImage
работает синхронно (то есть не вернется, пока задача не будет полностью выполнена),Если нет, вам придется использовать другие схемы.