2014-06-27 67 views
0

我創建了一個簡單的測試應用程序,以瞭解如何使用NSURLSession。這個應用程序必須從web服務下載圖像,並將它們呈現爲UITableView。 我已經寫了應用程序的第一部分,它從Web服務讀取圖像URL列表,現在我想顯示這個列表。使用NSURLSession下載大量圖像

我的疑問是:

因爲圖像列表中可能是一個很長的名單,是它確定爲每個圖像的NSURLSessionDownloadTask? 我想在cellForRowAtIndexPath函數中創建會話並將NSURLSessions存儲在NSDictionary中,使用該單元格的IndexPath作爲關鍵字(並且可能依靠NSURLCache避免多次下載相同的圖像)。

其他解決方案

我可以看到三個解決方案:

  1. 使用GCDdispatch_async

  2. 子類的NSOperation和基本存儲的NSOperation因爲我需要下載任何圖像。

  3. 使用第三方庫如AFNetwork ...但由於它是一個學習目的的應用程序,我寧願完全使用我的代碼 。

如果多個NSURLSession不是一個好的解決方案,我會選擇其中一個選項。

您對這種方法有什麼看法?

+0

就我而言,我使用過GDC,對我來說這也是一個不錯的選擇。 –

+0

考慮向後兼容性。 'NSURLSession'只存在於iOS7 +中。 – Eonil

回答

5

NSURLSessionTask適用於大量的下載。它與其他一些您提到的方法相比的一個優點是可以取消或暫停下載。它還能夠正確地實現網絡操作的併發性,這比網上許多貓會讓你相信的難度要大(如果你不相信我,請查看愛斯基摩人的2010年WWDC會話和示例代碼)。網絡連接的NS操作並不是微不足道的)。

NSURLSessionTask和朋友是專爲您正在嘗試解決的各種問題而設計的,並且經過了很好的測試。

對於桌面視圖,在tableView:willDisplayCell:forRowAtIndexPath:中啓動任務並取消(或暫停)tableView:didEndDisplayingCell:forRowAtIndexPath:中的任務。這將限制活動下載到當前可見的單元格。

3

建議:

我也碰到過類似的情況是我需要下載約2000圖像文件和100個視頻文件。爲此,我實現了一個使用NSOperationQueue和塊的自定義下載管理器。

我已將此庫添加到GitHub,請隨時查看實施情況。

1

IMO雖然可以爲每個圖像創建一個NSURLSessionTask標準的先進先出實現會在滾動單元格時導致問題。原因是下載將在NSURLSession上排隊,並且任務將按照它們添加到隊列中的順序執行,換句話說就是以FIFO的方式執行。想象一下你已經在大量的單元格中滾動的場景,你必須等待所有的下載順序完成。您不僅需要等很長時間,還會對可能不再與用戶相關的圖像資源發出不必要的網絡請求。

Nick Lockwood創建了一個很好的NSOperationQueue子類,名爲NSOperationStack,它顛倒了操作的順序,以便最後執行的操作(LIFO)。 IMO需要大量下載LIFO實施。

NSOsperationStackhere

如果合併這與使用cellForRowAtIndexPath發起並NSURLCache來存儲下載的實現,你應該結束了一個非常精簡,高效的解決方案。

1

我會使用(或至少看看)SDWebImageSDWebImageManager

除了下載,你可以設置優先級,並繼續在我認爲你會想要的背景選項。