Есть ли способ отменить параллельную операцию DispatchQueue? - PullRequest
0 голосов
/ 04 июня 2019

Есть ли способ остановить параллельную операцию?

let count = arr.count
let group = DispatchGroup()
group.enter()
DispatchQueue.concurrentPerform(iterations: count, execute: { i in
    if stop { group.leave(); return }  // Crashes with EXC_BAD_INSTRUCTION
    // ..
})
group.wait()

Это происходит с EXC_BAD_INSTRUCTION после нескольких итераций. Похоже, group.leave() не завершает операцию. Как выйти отменить операцию? По сути, я пытаюсь выполнить одновременный цикл массива и выйти из него, если выполняется какое-то условие, без использования моста Objective C для одновременного перечисления.

1 Ответ

1 голос
/ 04 июня 2019

DispatchQueue.concurrentPerform вызывает выполнение блока указанное количество раз и ожидает завершения всех итераций. Нет способа предотвратить это. (Блоки работают параллельно, если целевая очередь является параллельной.)

Конечно, каждый рабочий элемент может «досрочно вернуться», если выполняется какое-то условие, но это не повлияет на другие рабочие элементы.

Ваш код дает сбой, потому что leave() вызывается в группе рассылки чаще, чем enter().

...