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