20

У меня есть метод, который в некоторых случаях делает изменения пользовательского интерфейса.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 только в случае другого потока, но он заставит меня создать еще один метод или блок с этими обновлениями пользовательского интерфейса.
+0

Нет необходимости создавать блок или функцию anothet с помощью [NSThread isMainThread] в качестве кондоции. Вы можете рекурсивно перезвать исходную функцию на mainthread, если она вызывается из другого потока. Это всего лишь 2 строки кода и еще одна инструкция if. – ingaham

ответ

31

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

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

+1

И особенно не используйте (теперь устаревший для iOS) 'dispatch_sync (dispatch_get_current_queue()'), у которого была «функция» иногда блокирования, иногда нет, в зависимости от того, был ли вы вызван в основной поток или нет! – sapi

5

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

+1

Можете ли вы предоставить любую ссылку, пожалуйста? –

+6

Ухх ... это просто «как работает этот материал». – ipmcc

Смежные вопросы