В Swift я иногда использовал этот тип рисунка.
DispatchQueue.global().async {
// do stuff in background, concurrent thread
DispatchQueue.main.sync {
// update UI
}
}
Цель этого шаблона ясна. Делайте много времени для расчета в глобальном потоке, поэтому пользовательский интерфейс не блокируется и обновляет интерфейс в основном потоке после завершения расчета.
Что делать, если не рассчитывать? Я только что нашел логику в своем проекте, который
//A
DispatchQueue.main.sync {
// do something
}
но
// B
DispatchQueue.global().async {
DispatchQueue.main.sync {
// do something
}
}
не сбой.
Как они отличаются? И есть ли случай B по-разному только с этим?
// C
DispatchQueue.main.async {
// do something
}
И еще один вопрос. Я знаю, что основной поток является последовательной очередью, но если я запускаю несколько кодовых блоков в нескольких main.async
, он работает как параллельная очередь.
DispatchQueue.main.async {
// do A
}
DispatchQueue.main.async {
// do B
}
Если основной поток действительно является последовательной очередью, как они могут работать одновременно? Если это всего лишь отрезок времени, чем то, как они отличаются от глобальной параллельной очереди, отличной от основного потока, можно обновить интерфейс?