0

Я вызываю dispatch_async(dispatch_get_main_queue(),block()), а мой block() не выполняет взаимодействия с пользовательским интерфейсом, потому что он не получает вызов в основном потоке, почему?Получить главный блок очереди, который не выполняется в основном потоке

Примечание: Я использую PSPDFUIKitMainThreadGuard

Just a runtume illustration of the issue where a block named showListOfProviders() crash on setting a title of a UIViewController

+0

Просто из любопытства: есть особая причина для использования 'DISPATCH_QUEUE_PRIORITY_LOW' вместо' DISPATCH_QUEUE_PRIORITY_DEFAULT'? –

+0

Я использую 'DISPATCH_QUEUE_PRIORITY_LOW' для выполнения связи с сервером – Laszlo

+0

Я понимаю это, но почему явно ниже, чем приоритет по умолчанию? :) –

ответ

0

Вы должны вызвать модификации UI блоков, как dispatch_sync() в основном потоке, так как это, он может обновить пользовательский интерфейс без блокирования.

+0

Я всегда использовал 'dispatch_async (dispatch_get_main_queue(),^{});' для выполнения в основном потоке без каких-либо проблем раньше. – Laszlo

+0

Я всегда использовал 'dispatch_sync (dispatch_get_main_queue(),^{});' для выполнения моих обновлений пользовательского интерфейса без каких-либо проблем. Основной поток можно использовать в dispatch_async, но для обновления пользовательского интерфейса я советую вам использовать версию синхронизации. Вы пробовали? –

+0

Использование dispatch_sync может легко привести к взаимоблокировке, поэтому поэтому я использую только dispatch_async, кстати разница: http://stackoverflow.com/a/19822753/1293167 – Laszlo

0

Вот как вы можете сделать это в Swift:

runThisInMainThread {() -> Void in 
    // Run the method that crashes in here 
} 

func runThisInMainThread(block: dispatch_block_t) { 
    dispatch_async(dispatch_get_main_queue(), block) 
} 

Его включены в качестве стандартной функции в моем репо, проверить это: https://github.com/goktugyil/EZSwiftExtensions

0

Вы на самом деле не диспетчеризацию в основной поток, из внешнего вида вашего вопроса вы вызываете свой блок и передаете возвращаемое значение вашего блока, например dispatch_async(queue, yourReturnValue);

Должно быть: dispatch_async(queue, yourBlock); Не: dispatch_async(queue, yourBlock());