1

我试图加快我的应用程序的启动,并且我的想法之一是使用异步调度队列。我有两个任务可以在启动时彼此相邻运行(实际上相当大的任务)。但是,它们都具有在主线程(主要是UI代码)上运行的重要部分。主线程上的多个GCD调度

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的在开机一样,他们将轮流在执行,或将完整的第一块首先执行,那么第二块?

回答

6

主队列是串行队列。添加到串行队列的块按照它们添加的顺序执行,并且一次只执行一个(串行)。在你的例子中,任务2将不会启动,直到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 */}); 
+0

如果它是一个串行队列,那我为什么可以调用异步调度呢? – 2012-03-05 15:44:12

+1

我不明白你的问题,为什么你不能? async只是意味着你想排入一个块,但现在不一定需要结果,或者希望它阻止你将它排入队列的当前操作。它不要求它在不同的线程上发生或立即开始。 – 2012-03-05 15:51:10

+3

似乎有一种常见的误解,即“异步”和“并发”是同义词。我不确定它来自哪里,但是我看到它遍布堆栈溢出。 – 2012-03-05 16:56:27

-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 
    }); 
}); 
+0

因此,替代方案确保它们将按照该顺序执行,并且我的示例可以让task2在task1之前完成?注意:我正在寻找最后一个行为。 – 2012-03-05 12:51:02

+0

是的,我的选择将确保一个任务在另一个之后开始。 – fbernardo 2012-03-05 13:31:32

+3

主队列不同时执行任务 – 2012-03-05 14:06:04