2014-03-25 51 views
-1

我使用這種方法來下載圖片:下載圖像和顯示的CollectionView細胞這些圖像

image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://upload.wikimedia.org/wikipedia/en/d/d8/Url-logo.png"]]]; 

// save file. 
//NSString *documentDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 

//NSLog(@"%@", documentDir); 
NSLog(@"Saving Image"); 

NSString *imagePath = [NSString stringWithFormat:@"%@/Url-logo.png",documentDir]; 
NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(image)]; 
[imageData writeToFile:imagePath atomically:YES]; */ 

NSLog(@"image Saved"); 

現在我想下載多個圖像,然後保存在一個數組...然後告訴他們在的CollectionView細胞使用數組的indexPaths ...

是做不做這個正確的方式... 如果是,那麼我應該怎麼做才能保存多個圖像陣列,並顯示在集合視圖 任何想法/幫助............ ..

+0

嗨Z,,或許你是StackOverflow的新手,但是我們中的很多人都付出了很多努力來回答用戶的問題。回答問題對雙方都有好處,對每個人都有很好的學習體驗。您目前對您的問題有2個答案,而您在評論中沒有回覆他們。請在評論中投票提出問題或參加辯論,但不要無視這個問題。 –

+0

@DanielG對於遲到的答覆感到抱歉...實際上我最近幾個小時並沒有在那裏......而好消息是,我已經解決了我的問題......感謝您的合作和支持 –

+0

不用擔心Zaibi,如果您已經設法解決問題請提供你的答案或者投票給你幫助你的答案,那樣的話,任何其他人都可以從這裏學到相同的東西:) –

回答

3

調用 - [UIImage initWithData:]方法將僅在圖像數據已經在文件系統上時才起作用。你不想做的是下載一堆圖像並將它們保存在一個數組中。原因是你不希望所有這些圖像駐留在內存中(特別是那些不可見的圖像)。

雖然有圖書館可以幫助您,但我會鼓勵您嘗試這種策略,因爲在我看來,您還不熟悉iOS。

根據我對你的問題的理解,你將需要解決以下幾個概念

  1. 圖像磁盤存儲策略
  2. 映像文件路徑檢索
  3. 網絡
  4. 集合視圖集成

圖片磁盤存儲策略

假設您想要將這些圖像保存到磁盤並在下一次應用程序啓動時使用它們,那麼您需要閱讀https://developer.apple.com/library/mac/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html以瞭解這些圖像應存儲在磁盤上的位置。例如,使用TMP目錄獲取應用程序可以輕鬆獲取的資源,並且不希望它們備份。

映像文件路徑檢索

由於您使用某種形式的數據源的填充您的收藏來看,這個數據源也應負責在給定的索引路徑返回文件路徑的圖像。通過這種方式,當您的集合視圖以特定索引路徑查詢其單元格的數據源時,您將獲取所有單元格的相關信息並適當配置您的單元格。在你的情況下,這個數據源將簡單地爲特定索引處的給定圖像提供本地和遠程文件路徑。

集合視圖中的項目數量應該影響您用於設計數據源的策略。如果只有幾個文件路徑(< 10),那麼您可以使用NSDictionary,其中鍵是indexPath,對象是您的filePath。如果你有很多圖像,你肯定會需要一個持久性框架來避免將所有的圖像路徑放入駐留在內存中的一個對象。一種解決方案是將核心數據中的文件路徑保存到圖像中,這樣您就可以使用與您的集合視圖協調的提取結果控制器。這意味着爲每個indexPath獲取圖像的filePath,然後將其設置在您的collectionViewCell上。核心數據提供了一個非常棒的對象持久化框架,可以幫助您立即開始運行。

網絡

你將需要解決的管理下載當用戶滾動的另一個問題。例如,如果您在FIFO隊列中下載時速度較慢,那麼如果用戶滾動到集合視圖的末尾,則首先添加的圖像將佔據隊列,直到所有其他人都看不到圖像圖像被下載。一種解決方案是取消對不再可見的單元格的請求。 http://blog.yangmeyer.de/blog/2012/12/16/uitableviewcell-subclasses-and-async-loading是使用GCD異步渲染單元的文章之一。

有很多不同的方法可以接近網絡,因此最終取決於您的需求。有些人更喜歡對UIImageView進行子分類,爲UIImageView提供自動從給定URL下載圖像的功能。您可以通過提供遠程URL和本地文件路徑URL來實例化此類,如果本地路徑中不存在任何內容,則自定義子類將觸發下載。如果你實現這個策略,你將要添加取消這個自定義子類的下載的能力。

集合視圖集成

你的集合視圖將負責上述所有組件集成在一起。這意味着獲取要顯示的圖像數量,使用這些圖像填​​充集合視圖,方便使用網絡並取消對不可見圖像的圖像請求。

你想要解決的重要事情是可靠地使用併發API。您的網絡電話不應阻止主線程。我會建議創建一個管理所有下載的NSOperationQueue。這樣,當你關閉收集視圖時,你可以取消該隊列上的所有操作:)

+0

感謝您的詳細描述...讓我試試這個... –

+0

你說的是,沒有必要下載並保存設備/應用程序文檔目錄中的圖像。但如果應用程序必須脫機...那麼圖像如何下載並顯示在單元中... –

+0

如果您希望它們脫機,則應該將它們保存到磁盤。我說的是你應該將它們保存到磁盤並將filePaths存儲在一個持久性框架中。因此,這種方式當你保存一個圖像,你保存它的地方,然後當你想要檢索它,你調用[UIImage initWithContentsOfFile:pathToImage]; –

0

這是不正確的方式來加載圖像集合視圖中,使用圖像延遲加載方法加載圖像集合視圖,請參閱此示例代碼圖像延遲加載==>EGOImageLoading

1

你的方式是不好的方法來做到這一點。因爲,您下載圖像的每個圖像都保存在設備中,而不是顯示在UICollectionViewCell中。它看起來像你的圖像不是那麼大,但不要忘記設備內存是有限的。所以,除非你真的需要,否則你不應該這樣使用它。

此外,您不需要在顯示UICollectionViewCell之前保存所有圖像,但您可以做的是加載您的圖像懶惰。您可以使用許多第三方庫來實現該目標,但我的建議是SDWebImage。您可以從文檔中閱讀更多內容並查看示例。你會發現它的使用真的非常簡單。大部分流程對您而言都是透明的。你只需要設置圖片網址,然後它爲你處理所有事情。

+0

不想使用第三方...... –