0

有人可以解釋異步NSURL請求與GCD和NSOperationQueues之間的關係嗎?異步NSURL請求如何適合大型中央調度/操作隊列?

我不確定何時使用每個。

現在,當我需要將數據提取/上傳到服務器時,我一直在使用異步NSURL請求「離開」。但有人建議我應該使用GCD。我的問題是我不知道現實生活中的例子GCD會更好。有沒有人對我有任何常見用例?如果我使用GCD存儲10個異步NSURL GET請求隊列,例如,這對我有什麼好處?在大型中央調度隊列或NSOperationQueue中有異步NSURL請求是否有意義?

謝謝!

回答

5

什麼是你的情況特別令人困惑的是,我們在混合的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塊和大中央調度實踐掌握大中央調度)。

+1

嘿ndfred,這是一個偉大而連貫的解釋。非常感謝你。強烈建議他人閱讀。 – user798719 2012-08-09 02:41:21

+0

非常歡迎。派遣隊列需要相當一段時間才能習慣,並將它們與請求隊列混合在一起並沒有幫助:) – ndfred 2012-08-10 19:30:09

1

這是脫離主題,但如果你使用AFNetworking庫,你不必做任何你上面提到的。 「

」AFNetworking是一款適用於iOS和Mac OS X的令人愉快的網絡庫,它基於NSURLConnection,NSOperation和其他熟悉的基礎技術構建而成,它具有模塊化的架構和精心設計的功能豐富的API,歡樂的使用。「

回答你的問題,請仔細閱讀本

http://www.cocoaintheshell.com/2011/04/nsurlconnection-synchronous-asynchronous/