Подтвердить что ты не робот

Dispatch_get_main_queue() в основной теме

У меня есть метод, который в некоторых случаях изменяет пользовательский интерфейс.

Например:

-(void) myMethod {

  if(someExpressionIsTrue) {
    // make some UI changes
    // ...
    // show actionSheet for example
  }
}

Иногда myMethod вызывается из mainThread иногда из некоторого other thread.

Вот почему я хочу, чтобы эти изменения пользовательского интерфейса выполнялись, безусловно, в mainThread.

Я изменил необходимую часть myMethod следующим образом:

if(someExpressionIsTrue) {
     dispatch_async(dispatch_get_main_queue(), ^{
        // make some UI changes
        // ...
        // show actionSheet for example
      });
}

Итак, вопросы:

  • Безопасное и хорошее решение для вызова dispatch_async(dispatch_get_main_queue() в основном потоке? Это влияет на производительность?
  • Можно ли решить эту проблему другим лучшим способом? Я знаю, что могу проверить, является ли это основным потоком с использованием метода [NSThread isMainThread] и вызывает dispatch_async только в случае другого потока, но он заставит меня создать еще один метод или блок с этими обновлениями пользовательского интерфейса.
4b9b3361

Ответ 1

Нет проблем с добавлением асинхронного блока в основной очереди из основной очереди, все, что он делает, это запустить метод позже в цикле запуска.

То, что вы определенно не хотите делать, это вызвать dispatch_sync добавление блока в основную очередь из основной очереди, поскольку вы в конечном итоге заблокируете себя.

Ответ 2

Не беспокойтесь, если вы вызываете dispatch_async в основном потоке или нет. iOS поместит блок в очередь и выполнит блок в основном потоке.