在UI线程上运行dispatch_async(dispatch_get_main_queue()的目的

时间:2015-04-17 05:26:30

标签: ios

在实际案例中看到dispatch_async(dispatch_get_main_queue()在UI Thread上实现是很常见的。我无法弄清楚它的用途。

我的想法是因为UI线程上只有一个线程,dispatch_async的目的是什么?

举一个我几天前在这里遇到的真实例子:

在UI线程上运行“NSTimer scheduledTimerWithTimeInterval”以更新“_scrollView contentOffset”

1没有派遣: setContentOffset在下一个NSTimer计划

之前生效

2发送: setContentOffset立即生效

5 个答案:

答案 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,