Использование цикла while
, который будет привязывать ЦП к 100% только для того, чтобы он мог проверить флаг, который в конечном итоге будет установлен в каком-то другом потоке, далек от идеального выбора.
Я предлагаю использовать group.wait
. Вот примерная схема кода:
for siteIndex in 0..<countySites.count {
let group = DispatchGroup()
group.enter()
distanceAndDirections.calculate { (response, error) in
// stuff
group.leave()
})
group.wait()
}
Обратите внимание на изменение, чтобы создать новую группу внутри цикла и исключить while
занятый цикл.
Еще один вариант использования группы - использовать семафор.
Самая важная вещь здесь - убедиться, что ничего, что сделано внутри асинхронного блока, не приведет к любой попытке запустить код в той же очереди, что и основной цикл for
.
И, конечно, вы должны убедиться, что этот основной цикл for
не выполняется в главной очереди.