Как я могу заставить свой код ждать завершения задачи в DispatchQueue? Нужен ли для этого CompletionHandler или что-то в этом роде?
func myFunction() {
var a: Int?
DispatchQueue.main.async {
var b: Int = 3
a = b
}
// wait until the task finishes, then print
print(a) // - this will contain nil, of course, because it
// will execute before the code above
}
Я использую Xcode 8.2 и пишу на Swift 3.
swift
multithreading
asynchronous
swift3
grand-central-dispatch
Бартош Возняк
источник
источник
wait
подход (если для вас нет проблем с блокировкой, т.е. если вы не в основном потоке), либо предоставьте обработчик завершения, либо используйте подход уведомления в вызывающем классе.group.enter
за пределы асинхронного блока? Разве каждый блок не должен входить в группу и выходить из нее?wait
ждет , покаenter
иleave
вызовы сбалансированы. Если вы положилиenter
в закрытии,wait
не ждать бы потому , чтоenter
еще не было , и , таким образом , называется числоenter
иleave
вызовы будут сбалансированы (# введите == 0, # leav == 0).XCTTestExpectation
Вместо этого используйте s. См. Этот образец кодаВ Swift 3 нет необходимости в обработчике завершения при
DispatchQueue
завершении одной задачи. Более того, вы можете достичь своей цели разными способамиОдин из способов это:
Он будет ждать завершения цикла, но в этом случае ваш основной поток будет заблокирован.
Вы также можете сделать то же самое:
И последнее: если вы хотите использовать завершениеHandler, когда ваша задача завершается с помощью DispatchQueue, вы можете использовать
DispatchWorkItem
.Вот пример использования
DispatchWorkItem
:источник
Swift 5 версия решения
func myCriticalFunction () {var value1: String? var value2: String?
}
источник
Использовать группу отправки
источник
DispatchQueue.global().async{}
не блокирует основную очередь.Swift 4
В этих ситуациях вы можете использовать асинхронную функцию. Когда вы используете
DispatchGroup()
, Иногда может возникнуть взаимоблокировка .источник