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
только в случае другого потока, но он заставит меня создать еще один метод или блок с этими обновлениями пользовательского интерфейса.
Ответы
Ответ 1
Нет проблем с добавлением асинхронного блока в основной очереди из основной очереди, все, что он делает, это запустить метод позже в цикле запуска.
То, что вы определенно не хотите делать, это вызвать dispatch_sync
добавление блока в основную очередь из основной очереди, поскольку вы в конечном итоге заблокируете себя.
Ответ 2
Не беспокойтесь, если вы вызываете dispatch_async в основном потоке или нет. iOS поместит блок в очередь и выполнит блок в основном потоке.