0

我打电话dispatch_async(dispatch_get_main_queue(),block())和我的block()未能执行UI交互,因为它没有在主线程中调用,为什么?获取主队列未在主线程执行

注:我用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(),因为这一点,它可以刷新UI不会被阻挡。

+0

我总是用'dispatch_async(dispatch_get_main_queue(),^ {});'在主线程上执行,之前没有任何问题。 – Laszlo

+0

我总是使用'dispatch_sync(dispatch_get_main_queue(),^ {});'来执行我的UI更新而没有任何问题。主线程可用于dispatch_async,但对于UI更新,我建议您使用同步版本。你试过了吗? –

+0

使用dispatch_sync很容易造成死锁,所以这就是为什么我只使用dispatch_async,通过差异的方式: http://stackoverflow.com/a/19822753/1293167 – Laszlo

0

这里是你如何在斯威夫特做到这一点:

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());