примеру мы создаем асинхронный блок через диспач груп?
Если мы вызывыем DispatchQ.main.async {} то у нас создается собственный RunLoop для блока кода или же мы будем иметь доступ к RunLoop основного потока?
Ты совершенно путаешь эти понятия.
Run loop делает две вещи 1. ожидает пока что-то не произойдёт. 2. отправляет сообщение к получателю. вот если у каждого потока он свой, а мы создаем свою асинхронную задачу в отдельном потоке со своим RunLoop. разве не так?
Кто сказал что в отдельном потоке?
Вообще говоря RunLoop не связан с DispatchQueue (исключение, Main поток). RunLoop привязан к потоку и создаётся системой вместе с потоком, НО по умолчанию в незапущенном состоянии. Единственный поток, который сам запускает свой RunLoop - это Main. Итак, работа DispatchQueue вне Main потока не связана с RunLoop, а в Main потоке связана напрямую. Все блоки переданные в DispatchQueue.main отрабатывают в common mode и попадают в Input Source типа Perform selector.
получается что в приложении один RunLoop?
RunLoop в самом простом своём понимании делает лишь одну вещь, это бесконечный цикл, который заставляешь поток жить. Попробуй создать Thread и выполнить в нём какой-то блок. Он выполнится внутри созданного потока и на этом всё, поток умрёт. Если рассматривать RunLoop в расширенном понимании, то за каждый такт бесконечного цикла он просматривает перечень входящих событий в том или ином моде(режиме) и выполняет определённые действия, подсчитывает дедлайн для таймеров, выполняет peform блоки(те самые из DispatchQueue.main) и много чего ещё, НО это не означает, что на главном потоке не выполняется ничего кроме RunLoop.
По умолчанию да, внутри главного потока, благодаря ему приложение не завершается сразу после запуска.
а тогда если мы создаем свой Thread то у него будет свой RunLoop и он уже будет не давать своему потоку завершиться и будет обрабатывать его события, верно?
RunLoop внутри потока есть всегда, остаётся его запустить. И да, если запущен RunLoop внутри потока, то он не умрёт, до тех пока пока его не убить явно.
а какого рода события он может обрабатывать существуя в потоке который мы создали? События связанные только с вложенными задачами или же также нажатия на экран и прочие системные?
Любые, какие тебе будут нужны, помимо дефолтных таймеров и прочего списка:
Обсуждают сегодня