當選擇運行dispatch_async的隊列時, dispatch_get_global_queue被提及很多。這是一個特殊的 背景隊列,將任務委託給某個線程嗎?
某個線程?第dispatch_get_global_queue
爲您檢索所請求的相對優先級的全局隊列。由dispatch_get_global_queue
返回的所有隊列是併發的,並且可以根據系統的判斷向多個不同的線程分派工作。這個機制是一個實現細節,作爲API的消費者對你來說是不透明的。
在實踐中,並且存在過分簡化它的風險,每個優先級級別都有一個全局隊列,在撰寫本文時,根據我的經驗,每個人都會在任何時候調度工作介於0到64個線程之間。
它幾乎是單身?
嚴格不,但你可以把它們想象成單身人士,每個優先等級有一個單身人士。
所以,如果我使用的隊列總是爲我dispatch_async電話,將是 隊列得到充分而不得不等待事情完成之前,另一個 一個可以啓動,或者可以將其分配其他任務不同的線程?
它可以變滿。實際上,如果你正在飽和一個全球併發隊列(即同時在同一時間有超過64個相同優先級的後臺任務),那麼你的設計可能會很糟糕。(見this answer更多細節上的隊列寬度限制)
我猜我有點困惑,因爲當我選擇了 一個的NSOperation隊列中,我可以 選擇主線程隊列[ NSOperationQueue mainQueue],這似乎同義 dispatch_get_main_queue
他們沒有嚴格的代名詞。儘管NSOperationQueue
使用GCD,但還是有一些重要的區別。例如,在主運行循環的一次通過中,只有一個排入+[NSOperationQueue mainQueue]
的操作將被執行,而提交給dispatch_get_main_queue
的多個塊可能會在單次運行循環中執行。這可能對你無關緊要,但嚴格來說,它們不是同一件事。
,但我的印象是背景 隊列的NSOperation必須單獨製作 NSOperationQueue的情況下,但GCD有一個背景隊列單身? (dispatch_get_global_queue)
總之,是的。這聽起來像你在混合GCD和NSOperationQueue
。 GCD不僅僅是一個「簡單的包裝物」,它是它自己的東西。它在GCD之上實施的事實對你來說應該不重要。 NSOperationQueue
是一個任務隊列,具有明確可設置的寬度,您可以創建「隨意」實例。只要你喜歡,你可以製作儘可能多的。在某些時候,NSOperationQueue
的所有實例在執行NSOperations
時,都會從系統資源池中提取資源,與其他進程一樣(包括GCD),所以是的,這裏有一些交互,但它們對您而言是不透明的。
此外 - 愚蠢的問題,但要確保 - 如果我把一個任務 在隊列中,隊列被分配給一個線程,對吧?如果任務是 足夠大,它不會將其分割到多個線程上,是嗎?
單個任務只能在單個線程上執行。系統不得不將一個單一的任務「拆分」爲子任務。這是你的工作。關於你的具體用法,隊列沒有「分配給一個線程」,任務是。隊列中要執行的下一個任務可能會在完全不同的線程上執行。
«[dispatch_get_global_queue']是一個將任務委託給某個線程的特殊背景隊列嗎?»這真的很清楚地被函數文檔回答了。你讀過嗎?如果是這樣,請更具體地說明你不瞭解的內容。如果沒有,請閱讀。 –