在实际案例中看到dispatch_async(dispatch_get_main_queue()在UI Thread上实现是很常见的。我无法弄清楚它的用途。
我的想法是因为UI线程上只有一个线程,dispatch_async的目的是什么?
举一个我几天前在这里遇到的真实例子:
在UI线程上运行“NSTimer scheduledTimerWithTimeInterval”以更新“_scrollView contentOffset”
1没有派遣: setContentOffset在下一个NSTimer计划
之前生效2发送: setContentOffset立即生效
答案 0 :(得分:0)
dispatch_async(dispatch_get_main_queue(), ... )
强制在主线程(UI线程)的下一个运行循环中异步运行一段代码。某些代码必须在UI线程上运行,例如从UI添加/删除小部件或更新UI。
dispatch_async( .. )
用于不阻止当前线程。
答案 1 :(得分:0)
dispatch_async(dispatch_get_main_queue(),
^{
// perform something on UI
});
dispatch_async是一个低级GCD API(Grand Central Dispatch API)。我们知道应用程序主线程用于执行UI上的任何活动,如执行动画/任何其他UI相关的东西,所以在使用UI做一些工作的上下文中,它必须能够访问主线程和上面的GCD API它提供了对主线程的相同保证访问,以便UI执行任何相关操作。
答案 2 :(得分:0)
主队列的GCD通常是从后台队列完成的,以表示某些后台处理已完成。例如
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),^{
// Here you are doing a very expensive operation which will take let say 5 secs. And after 5 sec you will got your result. Let say
int output = //calculated result.
dispatch_async(dispatch_get_main_queue(), ^{
[[self myLable] setText:[NSString stringWithFormat:@"%d", output]];
});
});
在这种情况下,我们对后台队列进行了长时间的计算,以免阻塞主线程。获得结果后,我们需要更新UI。不应该从任何其他线程访问UIKit
,应该从main thread
访问UIKit
以避免竞争条件并防止在访问dispatch_async
期间崩溃。所以我们在这里使用dispatch_get_main_queue()
为{{1}}的主要线程提供机会。
答案 3 :(得分:0)
我个人在另一个dispatch_async
(背景,非UI线程)中使用它 - 当我做一些像计算或任何可以在后台线程上运行的东西然后我想要“回来”并相应地更新UI,dispatch_async(dispatch_get_main_queue()...)
将我返回UI线程,因此我可以更新UI。否则,如果我留在第一个dispatch_async
的后台线程中,则不会对UI进行任何更改。
答案 4 :(得分:0)
也许是代码" dispatch_async"不在主线程上,dispatch_get_main_queue保证块中的代码在主线程上运行。
它喜欢performselectonmainthread,