什麼是你的情況特別令人困惑的是,我們在混合的HTTP請求隊列(其中請求將被送往一個在另一個之後)和一個操作隊列(隨機計算離子工作是在一個接一個之後執行的)。
標準NSURLConnection
實例在主線程上調用它的委託,如果您當時沒有在數據或用戶界面上進行復雜的工作,那也沒關係。但是,假設您需要下載一個大文件,並將其按塊大塊寫入磁盤中,同時向下滾動表格視圖。現在,當您在磁盤上寫入數據時,您的滾動可能會變得不連貫,從而阻塞主線程。
這就是GCD
或其更高級別抽象NSOperationQueue
發揮作用。爲了解決這個問題,你需要從主線程中卸載數據寫入調用。您可以通過在NSURLConnection
上通過setDelegateQueue:
指定NSOperationQueue
實例來實現此目的。這將確保您的代理以及您的寫入調用將在後臺線程中調用。您還可以將代表呼叫保留在主線程中,並將昂貴的寫入呼叫包裝在一個塊中,然後您將使用dispatch_async
執行主線程。現在,NSOperationQueue
基本上包裝了一個調度隊列,並且通過在原始調度隊列中使用它來避免額外的線程切換,所以我建議使用NSOperationQueue
解決方案(這看起來更簡單)。
AFNetworking
是一個很好的庫,它以第三種方式解決了這個問題:它激發了NSThread
專用於NSURLConnection
委託調用。這是將GCD卸載主線程之前的GCD方式。雖然它有效,但GCD提供了一種更高效和公民的方式來向系統呈現您的後臺工作。
最後,如果你正在尋找一個HTTP請求隊列,Cocoa不會提供它。你將不得不自己構建一個調度程序,或者你已經想出了使用AFNetworking
,這又是一個很好的選擇。
如果你有興趣這個主題,GCD有很多更多的提供不僅僅是託管NSURLConnection
委託電話,我建議你閱讀蘋果的偉大Concurrency Programming Guide或觀看GCD優秀WWDC 2011 videos(塊和大中央調度實踐和掌握大中央調度)。
嘿ndfred,這是一個偉大而連貫的解釋。非常感謝你。強烈建議他人閱讀。 – user798719 2012-08-09 02:41:21
非常歡迎。派遣隊列需要相當一段時間才能習慣,並將它們與請求隊列混合在一起並沒有幫助:) – ndfred 2012-08-10 19:30:09