我打电话dispatch_async(dispatch_get_main_queue(),block())
和我的block()
未能执行UI交互,因为它没有在主线程中调用,为什么?获取主队列未在主线程执行
回答
你必须在主线程中调用UI修改块作为dispatch_sync()
,因为这一点,它可以刷新UI不会被阻挡。
我总是用'dispatch_async(dispatch_get_main_queue(),^ {});'在主线程上执行,之前没有任何问题。 – Laszlo
我总是使用'dispatch_sync(dispatch_get_main_queue(),^ {});'来执行我的UI更新而没有任何问题。主线程可用于dispatch_async,但对于UI更新,我建议您使用同步版本。你试过了吗? –
使用dispatch_sync很容易造成死锁,所以这就是为什么我只使用dispatch_async,通过差异的方式: http://stackoverflow.com/a/19822753/1293167 – Laszlo
这里是你如何在斯威夫特做到这一点:
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
你实际上并没有分派到主线程,从你的问题的外观来看,你正在调用你的块并传递块的返回值,例如dispatch_async(queue, yourReturnValue);
它应该阅读: dispatch_async(queue, yourBlock);
不: dispatch_async(queue, yourBlock());
- 1. 是否必须在主线程上执行GCD主队列?
- 2. RunWorkerCompleted未在主UI线程中执行?
- 3. iOS GCD:主线程从主队列以外的队列中取出队列?
- 4. 队列阻塞主线程
- 5. 获取主线程的消息队列和处理程序
- 6. 使用主线程队列的主线程Dispatch_sync无用?
- 7. 执行线程队列
- 8. 当主线程针对另一个调度队列发出dispatch_sync时,主队列/主线程会发生什么?
- 9. CoreBluetooth委托在主队列/主线程上?
- 10. 获取N行的组/线程/主题
- 11. 获取主程序未运行异常
- 12. 在主线程中执行JavaScript回调
- 13. System.Event是否在主线程中执行?
- 14. 在主线程中执行Action <>
- 15. startActivity应该在主线程上执行?
- 16. 执行在后台和主线程ios
- 17. 获取主线程的线程号
- 18. 从辅助线程获取主线程
- 19. 在这种情况下,主队列/当前队列和主线程/后台线程之间的区别?
- 20. GCD - 在主队列
- 21. GCD - 如何在主线程上等待主队列上执行的异步回调
- 22. Android:新主题Runnable在主线程中执行
- 23. Android ::在主线程中执行其他任务之前阻止主线程完成主线程
- 24. 执行人不是从主线程
- 25. 主线程的执行上下文
- 26. 对主线程执行方法问题
- 27. 获取进程主线程的句柄
- 28. 取消在主线程中执行的核心数据插入
- 29. Hibernate Search在主线程中执行同步执行
- 30. 长线运行正在主线程上执行
只是出于好奇:有没有使用'DISPATCH_QUEUE_PRIORITY_LOW',而不是'DISPATCH_QUEUE_PRIORITY_DEFAULT'一个特别的原因? –
我使用'DISPATCH_QUEUE_PRIORITY_LOW'来执行服务器通信 – Laszlo
我明白,但为什么明确低而不是默认优先? :) –