我已经在我的应用程序中成功地使用了grand中央调度,但我想知道使用这样的东西的真正优势是什么:
dispatch_async(dispatch_get_main_queue(), ^{ ... do stuff
甚至是
dispatch_sync(dispatch_get_main_queue(), ^{ ... do stuff
我的意思是,在这两种情况下,你都会触发一个在主线程上执行的块,而这恰恰是应用程序运行的地方,这将无助于减少负载。在第一种情况下,您无法控制块何时运行。我见过块在你启动后半秒就被执行的情况。第二种情况类似于
[self doStuff];
对吗?
我想知道你们怎么想的。
发布于 2011-10-27 00:24:43
希望我能正确理解你的问题,因为你想知道dispatch_async和dispatch_sync之间的区别?
dispatch_async
将以异步方式将块调度到队列。这意味着在继续执行方法中的其余代码之前,它会将块发送到队列,而不是等待它返回。
dispatch_sync
将同步地将该块分派到队列。这将阻止方法中剩余代码的任何更多执行,直到块完成执行。
我主要使用后台队列的dispatch_async
将工作从主队列中转移出来,并利用设备可能具有的任何额外内核。然后,如果我需要更新UI,则使用dispatch_async
连接到主线程。
祝好运
发布于 2014-07-10 10:48:12
它很有用的一个地方是UI活动,比如在冗长的操作之前设置微调器:
- (void) handleDoSomethingButton{
[mySpinner startAnimating];
(do something lengthy)
[mySpinner stopAnimating];
}
将不会工作,因为您在冗长的代码中阻塞了主线程,而不是让UIKit实际启动微调器。
- (void) handleDoSomethingButton{
[mySpinner startAnimating];
dispatch_async (dispatch_get_main_queue(), ^{
(do something lengthy)
[mySpinner stopAnimating];
});
}
将控制权返回给run循环,该循环将调度UI更新,启动微调器,然后从分派队列中获取下一项内容,即实际处理。处理完成后,将调用动画stop,并返回到run循环,然后使用stop更新UI。
发布于 2015-12-06 11:44:54
Async意味着异步,您应该在大多数时间使用它。你不应该在主线程上调用sync,因为它会锁定你的UI,直到任务完成。以下是在Swift中执行此操作的更好方法:
runThisInMainThread { () -> Void in
// Run your code like this:
self.doStuff()
}
func runThisInMainThread(block: dispatch_block_t) {
dispatch_async(dispatch_get_main_queue(), block)
}
它作为一个标准函数包含在我的存储库中,请查看它:https://github.com/goktugyil/EZSwiftExtensions
https://stackoverflow.com/questions/7905192
复制相似问题