DispatchQueue.main.async
означает, что вы ставите задачу в очередь в основной очереди, не дожидаясь ее выполнения.Задачи основной очереди будут автоматически запускаться в главном потоке по расписанию ОС.
Думайте о каждом DispatchQueue
как о работнике.Вызов .async
добавляет задачу в список TODO работника и не ждет, пока работник завершит задачу.DispathQueue.main
- это конкретный рабочий, который работает в главном потоке.
С другой стороны, .sync
будет блокировать поток до тех пор, пока не завершится выполнение блока задач.Вы можете вызвать .sync
в любом потоке, кроме основного, так как основной поток не должен быть заблокирован.
Это не значит, что вы не можете позвонить DispatchQueue.main.sync
.Вы можете вызвать DispatchQueue.main.sync точно так же, как любой пользовательский dispathQueue.sync в неосновном потоке.
Например,
DispatchQueue(label: "bgqueue", qos: .background).async
{
DispatchQueue.main.sync{}
}
в порядке.
Но
DispatchQueue.main.async{
DispatchQueue.main.sync{}
}
- это НЕ.
.sync
обычно не совсем полезно.Если вы хотите, чтобы что-то произошло после основной задачи очереди, вы просто помещаете это «что-то» в главную очередь.Не стоит блокировать поток, если не нужно.
При этом необходимо помнить два правила при использовании .sync
независимо от того, какая очередь получает вызов .sync
:
- никогда не вызывать
.sync
изочередь к себе, что вызывает тупик. - никогда не вызывать
.sync
из основной очереди, что блокирует поток пользовательского интерфейса.