如何控制和平衡我的應用程序正在執行的線程數量,如何限制它們的數量以避免應用程序阻塞,因爲已達到線程限制?如何以編程方式控制和平衡iOS應用程序正在執行的多個線程?
在這裏,所以我看到以下可能的答案:「主併發隊列(dispatch_get_global_queue)自動管理線程的數量」,我不喜歡,原因如下:
考慮以下模式(在我真正的應用程序有兩個更簡單,更復雜的例子):
dispatch_queue_t defaultBackgroundQueue() {
return dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
}
dispatch_queue_t databaseQueue() {
dispatch_queue_create("Database private queue", 0);
}
dispatch_async(defaultBackgroundQueue(), ^{
[AFNetworkingAsynchronousRequestWithCompletionHandler:^(data){
dispatch_async(databaseQueue(), ^{
// data is about 100-200 elements to parse
for (el in data) {
}
maybe more AFNetworking requests and/or processing in other queues or
dispatch_async(dispatch_get_main_queue(), ^{
// At last! We can do something on UI.
});
});
}];
});
這種設計非常往往導致這種情況的時候:
- 的應用由於線程數量限制已達到(類似於> 64)而被鎖定(類似於> 64)
- 速度較慢,因此窄隊列可能會被大量未決作業淹沒。
- 第二個也可以產生取消問題 - 如果我們有100個作業已經在串行隊列中等待執行,我們不能立即取消它們。
顯而易見的解決方案是用dispatch_sync替換敏感的dispatch_async方法,但它絕對是我不喜歡的。
這種情況下推薦的方法是什麼?
我希望一個比「僅使用NSOperationQueue - 它可以限制併發操作數量」更爲智能的答案確實存在(類似主題:Number of threads with NSOperationQueueDefaultMaxConcurrentOperationCount)。
更新1:唯一像樣的模式是看到:是將所有的塊的dispatch_async替換爲併發隊列,在NSOperationQueue基於併發隊列中運行這些塊的NSOperations中包含最大操作數限制(在我的情況下,最大操作限制在AFNetworking在其中運行其所有操作的基於NSOperationQueue的隊列中)。
你是什麼意思「該應用程序被鎖定」?您將始終有一些線程正在執行,並且只要某些線程正在執行,您的應用程序就會取得進展。 –
你是什麼意思,「不知所措」?如果您提交作業的速度比CPU能夠執行的速度快,那麼無論它們有多寬,隊列都會被積壓。 –
隨着你使用的方法(或NSOperation,就此而言),顯式線程的創建和觸發超出了範圍。我不一定同意這個問題和你想的一樣 - 但是,在回答這個問題時,你可以明確地控制創建的線程數的唯一方法是手動創建它們,例如使用NSThread。 – isaac