DevPrep

Все темы › Задачи с реальных собеседований

Найди баг в коде с DispatchGroup

Middle PRO

Задача

Функция должна выполнить 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

Потренируйтесь перед собеседованием

В DevPrep эти ответы превращаются в задачи на минуту: что напечатает код, найди баг, пробное собеседование. По задаче в день.

Скачать DevPrep в App Store