Поскольку здесь имеется более одного вопроса, давайте попробуем ответить на них один за другим.
, почему DispatchQueue.main.async обычно используется для асинхронизации задач X вГлавный поток.
Прежде чем упоминать прямой ответ, убедитесь, что у вас нет путаницы в понимании:
- Последовательный <===> Параллельный.
- Синхронизация <===> Асинхронизация.
Имейте в виду, что DispatchQueue.main
это последовательная очередь.Использование sync
или async
не имеет ничего общего с определением сериализации или валюты очереди, вместо этого они относятся к тому, как обрабатывается задача.Таким образом, выражение DispatchQueue.main.async
означает, что:
возвращает управление текущей очереди сразу после того, как задача была отправлена для выполнения в другой очереди.Он не ждет, пока задача не будет завершена.Она не блокирует очередь.
процитировано из: https://stackoverflow.com/a/44324968/5501940 (я бы рекомендовал проверить это.)
В другихсловами, async
означает: это произойдет на главной странице и обновит ее, когда она будет завершена.Вот что делает то, что вы сказали:
Поэтому, когда мы обычно выполняем обновление чего-либо в пользовательском интерфейсе, мы обычно используем эту функцию, поскольку для предотвращения каких-либо неотзывчивостей от приложения.
кажетсябыть разумным;Использование sync
вместо async
- заблокирует основную.
заставляет меня задуматься, пишет ли код внутри UIViewController, обычно выполняемый в основном потоке?
Прежде всего: по умолчанию, без указания того, какой поток должен выполнять фрагмент кода, это будет основной поток.Однако ваш вопрос кажется неопределенным, потому что внутри UIViewController
мы можем вызвать функции, которые не выполняются в главном потоке, указав его.
, но также зная, что callback & completeHandler обычно выполняютсябез указания того, в каком потоке они находятся, и у пользовательского интерфейса никогда не было проблем с этим !!так что это на заднем плане?
"зная, что callback & extensionHandler обычно выполняются без указания того, в каком потоке они находятся" Нет!Вы должны указать это.Хороший реальный пример для этого, на самом деле вот как Main Thread Checker работает.
Я полагаю, что здесь что-то не хватает, когда вы имеете дело со встроенным методом из UIKit
- например, - который возвращает обработчик завершения, мы не можем видеть, что он содержит что-то вроде DispatchQueue.main.async
при вызове обработчика завершения;Итак, если вы не выполнили код внутри обработчика его завершения внутри DispatchQueue.main.async
, мы должны предположить, что он обрабатывает его для вас!Это не значит, что он где-то не реализован.
Еще один пример из реальной жизни, Alamofire!При вызове
Alamofire.request("https://httpbin.org/get").responseJSON { response in
// what is going on here work has to be async on the main thread
}
Поэтому вы можете вызывать его, не сталкиваясь с какой-либо «зависшей» проблемой в основном потоке;Это не значит, что он не обработан, а означает, что они обрабатывают его для вас, так что вам не нужно об этом беспокоиться.