Найди баг в коде с DispatchGroup
Задача
Функция должна выполнить work для всех элементов параллельно, собрать результаты в исходном порядке и один раз вызвать completion. Где ошибка?
func performAll<T>(_ items: [T],
work: @escaping (T, @escaping (T) -> Void) -> Void,
completion: @escaping ([T]) -> Void) {
let group = DispatchGroup()
let queue = DispatchQueue(label: "perform", attributes: .concurrent)
var result = items
group.notify(queue: .main) {
completion(result)
}
for (index, item) in items.enumerated() {
queue.async {
group.enter()
work(item) { response in
queue.async(flags: .barrier) {
result[index] = response
group.leave()
}
}
}
}
}
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep