Какая нить по умолчанию - PullRequest
3 голосов
/ 06 марта 2019

В iOS у нас есть GCD и Operation для одновременного программирования.

глядя на GCD у нас есть QoS классы, и они просты и понятны, вопрос в том, почему DispatchQueue.main.async обычно используется для асинхронных X задач в Main Thread ,

Поэтому, когда мы обычно выполняем обновление чего-либо в UI, мы обычно используем эту функцию, поскольку она предотвращает любую безответственность приложения.

заставляет меня задуматься, пишется ли код внутри UIViewController, обычно выполняемый в основном потоке?

но также зная, что callback & completionHandler обычно выполняется без указания того, в каком потоке они находятся, и у UI никогда не было проблем с этим !! так это на заднем плане?

Как Свифт справляется с этим? и какой поток я пишу по умолчанию, не указывая ничего?

1 Ответ

1 голос
/ 06 марта 2019

Поскольку здесь имеется более одного вопроса, давайте попробуем ответить на них один за другим.

, почему 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
}

Поэтому вы можете вызывать его, не сталкиваясь с какой-либо «зависшей» проблемой в основном потоке;Это не значит, что он не обработан, а означает, что они обрабатывают его для вас, так что вам не нужно об этом беспокоиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...