2012-02-15 45 views
2

假設我在做一個異步連接到Web服務,它通過定義,因爲它是異步從主線程的獨立線程中運行。iPhone - GCD發送異步操作的串行調度隊列

現在可以說,我把這個代碼的工作或塊串行調度隊列。由於串行調度隊列一次不能處理多個作業,但是我發送的作業已經是異步作業,那麼在調用異步作業之後,它會認爲作業要完成嗎?或者是否會在處理下一份工作之前等待異步作業完成?

什麼併發隊列,將併發線程生成,生成另一個線程來處理異步操作?

編輯:我知道我的問題是真不明白,所以我的問題是:

如果我使用的是相同的串行調度隊列,我派遣使用dispatch_async的代碼塊已經爲執行異步操作例如一個NSURLConnection - initWithRequest:委託:運行異步,在異步調用之後該塊會被串行隊列認爲是否完成,並且該異步調用是否會生成另一個線程?或者隊列還會等待作業1在處理完第二份作業之前已完成異步處理嗎?

+0

你派遣給*同一個隊列*? – DarkDust 2012-02-15 14:58:21

+0

@DarkDust是使用相同的隊列。 – 2012-02-15 15:12:32

回答

3

當你發送一個串行隊列,每個調度塊處理一前一後。因此,如果您的第一個塊需要很長時間才能處理,則第二個塊將不會被調用,直到長時間運行的第一個塊完成。

如果你使用dispatch_async新的塊入隊是簡單地把在隊列的末尾,函數dispatch_async立即返回,你可以去上。但是,在前面的塊完成之前,塊不會被執行。

然而,dispatch_sync會等到塊得到了它的轉向執行和完成。因此,在您的情況下,dispatch_sync將會阻塞,直到長時間運行的第一個塊完成。

如果派遣併發隊列,那麼第二塊將獲得一個新的線程中運行,因此第一塊不會阻止第二運行。

你也可以創建兩個隊列,他們全身心地投入到不同的任務,例如只爲您的Web服務的東西一個隊列,另一個隊列爲不同的任務。這取決於這些操作如何相互關聯,哪些可以並行運行,哪些必須依次運行。

+0

謝謝你的回答DarkDust,我意識到我的問題並不清楚,所以我編輯我的答案抱歉的混淆。我贊成你的回答,因爲它與第一個不清楚的問題有關。 – 2012-02-15 16:21:06

+0

*隊列*不會中止第一個塊,因此第一個塊不被視爲完成。第一個區塊仍將被視爲*運行*,第二個區塊將被視爲*排隊*。所以在開始執行第二個塊之前,隊列仍然會等待第一個塊完成。但是實際的函數調用'dispatch_async'會立即返回(這是_async的重點)。 – DarkDust 2012-02-15 16:38:39

+0

謝謝,這是有道理的。 – 2012-02-15 18:21:41