Разница требует MainQueueSetup и dispatch_get_main_queue? - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь узнать о создании собственных модулей для iOS, и появился один аспект

Официальная документация по созданию потоков упоминает этот блок кода вместе с его вариациями

- (dispatch_queue_t)methodQueue
{
  return dispatch_get_main_queue();
}

Есть еще один недокументированный мир, который я часто видел в сторонних библиотеках:

+ (BOOL)requiresMainQueueSetup
{
    return NO;
}

Мне они кажутся похожими, но разными, поэтому я хотел попроситьобъяснение следующих вопросов

  1. Когда следует добавить dispatch_get_main_queue в модуль и что произойдет, если он пропущен?

  2. Когда следует requiresMainQueueSetup добавить в модуль и что произойдет, если он пропущен?

  3. Можно ли использовать dispatch_get_main_queue и requiresMainQueueSetup вместе, если да, то почему и когда?

  4. В чем разница между возвратом YES и NO из requiresMainQueueSetup?

1 Ответ

0 голосов
/ 09 июня 2018
  1. Вам нужно dispatch_get_main_queue() всякий раз, когда вы обрабатываете события во вторичном потоке, которые будут влиять на основной поток.Обычно это связано с изменениями пользовательского интерфейса.Если вы создаете реактивный модуль, который не включает собственный рендеринг, вам, вероятно, не понадобится основная очередь.Асинхронный материал должен вызываться во вторичном потоке, и именно здесь вы должны реализовать dispatch_get_main_queue(), чтобы убедиться, что ваш пользовательский интерфейс обновляется после выполнения асинхронных действий.

  2. Я задал этот же вопрос о SO несколько недель назад, но безуспешно, и после некоторых исследований я теперь знаю, что это связано с пулей № 1. React-native ожидает, что вы реализуете этот метод(никак не связан с iOS), и вам нужно будет возвращать YES, если вы хотите сделать нативный рендеринг iOS.Это обеспечит запуск вашего собственного модуля в главном потоке, который актуален в случае взаимодействия с пользовательским интерфейсом.Вы не хотите, чтобы приложение замораживало ваш пользовательский интерфейс в случае интенсивной обработки.

  3. Если вы не предоставите requiresMainQueueSetup() Reaction-native выдаст предупреждение, но на этом этапе установит значение YES.Это значение по умолчанию изменится в следующей версии на NO.Итак, чтобы ответить на ваш вопрос: их можно использовать вместе, но не каждая комбинация имеет смысл.Также в этом случае, если вы не создаете новый собственный компонент пользовательского интерфейса iOS, вам, вероятно, не понадобится доступ к основному потоку через dispatch_get_main_queue().Реактивный мост гарантирует, что родные события и методы всегда будут передаваться из iOS в JS и наоборот, независимо от того, в каком потоке они работают.

  4. Эта проблема была рассмотрена в предыдущих пунктах

Редактировать: некоторая дополнительная информация, чтобы убедиться, что все ясно.Подводя итог: requiresMainQueueSetup() не имеет ничего общего с iOS, и создается только реагирующим, чтобы знать, каковы намерения вашего собственного модуля (пользовательского интерфейса или другого).dispatch_get_main_queue() не имеет никакого отношения к реактивному-нативному и имеет отношение только к вашему нативному коду.Это в основном обратный вызов для вторичных потоков, чтобы сообщить основному потоку, что некоторые асинхронные действия выполнены.

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