主线程上的多个GCD调度

时间:2012-03-05 12:27:31

标签: iphone objective-c ios multithreading grand-central-dispatch

我正在尝试加速我的应用程序的启动,我的一个想法就是使用异步调度队列。我有2个任务可以在启动时彼此相邻运行(实际上是非常大的任务)。但是,它们都具有在主线程上运行的重要部分(主要是UI代码)。

dispatch_async(dispatch_get_main_queue, ^{
    [self doTask1];
});

dispatch_async(dispatch_get_main_queue, ^{
    [self doTask2];
    //Will task 2 take turns with task 1, or will task 2 start after 1 is finished?
});

我的问题是:如果我在启动时调用2个dispatch_async,就像在这个例子中一样,它们会轮流执行,还是先完成第一个块,然后执行第二个块?

2 个答案:

答案 0 :(得分:6)

主队列是一个串行队列。添加到串行队列的块按添加顺序执行,一次只执行一个(串行)。在您的示例中,task2将在task1完成后才会启动。

如果您希望它们同时运行,则需要将它们分配给其中一个全局并发队列。

dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(q, ^{/* this work may finish before other work added to this queue later */});

答案 1 :(得分:-2)

一个将在另一个之后执行,但它们将同时执行,这意味着您可以在task1完成之前执行task2。

检查备选方案:

dispatch_async(dispatch_get_main_queue, ^{
    [self doTask1];
    dispatch_async(dispatch_get_main_queue, ^{
        [self doTask2];
        //Now task2 will execute after task1
    });
});
相关问题