2017-09-08 42 views
0

我在iOS上編寫類似於工作線程或後臺線程的東西。每次有任務進入時,我都會把它放到後臺線程中。但問題是,我不想每次都使用這個dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{});,因爲它會使任務在不同的線程中運行,並且創建一個線程需要很多時間。如何在相同的全局隊列中添加後臺任務?

所以我的問題是如何使一個GCD隊列,並把它運行在相同的後臺線程,我會讓它運行回主線程結果出來時。

回答

1

你似乎正在使用「線程」和「隊列」,就像它們是一樣的東西。他們不是。隊列是可以使用1個或多個實際線程實現的更高級別的抽象。

使用dispatch_get_global_queue每次都可能會給你一個不同的隊列。所以你需要做的第一件事就是創建一個你使用的隊列,而不是每次都要求一個新的隊列。使用dispatch_queue_create創建單個隊列。在適當的範圍內存儲對此的引用,以便您可以在任何需要它的地方引用它。

既然您只有一個隊列,您需要決定隊列是併發隊列還是串行隊列。一個串行隊列將只使用1個線程,而一個併發隊列可以使用多個線程。通過將適當的值傳遞給dispatch_queue_create函數的attr參數,可以獲得所需的隊列。

的Objective-C:

創建隊列:

dispatch_queue_t myQueue = dispatch_queue_create(@"my_global_queue", DISPATCH_QUEUE_CONCURRENT); // or use DISPATCH_QUEUE_SERIAL 

使用隊列:

dispatch_async(myQueue, ^{ 
    // code 
}); 

斯威夫特:

創建隊列:

let myQueue = DispatchQueue(label: "my_global_queue") // serial 

或:

let myQueue = DispatchQueue(label: "my_global_queue", attributes: .concurrent) // concurrent 

使用隊列:

myQueue.async { 
    // code 
} 
+0

十分感謝!我已經完成了我的代碼 –

相關問題