主线程上的多个GCD调度

Eri*_*k S 1 iphone multithreading objective-c grand-central-dispatch ios

我正在尝试加速我的应用程序的启动,我的一个想法是使用异步调度队列.我有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?
});
Run Code Online (Sandbox Code Playgroud)

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

Ash*_*ark 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 */});
Run Code Online (Sandbox Code Playgroud)

  • 似乎存在一种常见的误解,即"异步"和"并发"是同义词.我不知道它来自哪里,但我看到它遍布堆栈溢出. (3认同)