2013-06-05 34 views
2

我正在做我的iOS應用程序上傳到我的服務器的功能。我現在正在設計這樣做的最佳方式,並認爲我的方法會遇到麻煩。NSData圖像在內存中的重量與打開的圖像一樣多嗎?

我有超過20張圖片,我想發送1請求使用AFmultiparFormDataAFNetworking與文本信息與該圖片相關。

現在...我知道如何創建NSDictionary裏面有很多信息,但從未創建過NSDictionary,其中有NSData格式的20張圖像,或者試圖一次上傳很多圖片。

問題是我不知道NSData圖像是否會佔用與圖像一樣多的內存空間。因此,我當時只能做2/3(如果他們是全屏圖像,他們不是,但它只是一個任意的測量點)

鑑於我說的和下面的seudo代碼,我可以做那還是會耗盡內存?否則我會被留下的1

// for loop that does this 20 times 
UIImage* image = [UIImage imageNamed:myExercise.exercisePictureThumb]; 
NSData * exercisePictureThumb = UIImagePNGRepresentation(image1); 

// add to dictionary recursively 
+5

試過了嗎? – Undo

+0

正如我所說我正在構建它......測試它意味着實施...... –

+5

製作一個簡單的程序,爲它提供一些圖像,並看看會發生什麼。 – Undo

回答

5

你不應該把所有的圖像數據轉換爲NSDictionary做1,因爲這很可能導致內存問題。

取而代之的是,爲您的文件創建一個字典或URL數組,然後利用AFNetworking的multipartFormRequestWithMethod:path:parameters:constructingBodyWithBlock:AFMultipartFormData protocol,特別是appendPartWithFileURL:name:fileName:mimeType:error:。通過這種方式,所有圖像的圖像數據一次不會全部存儲在內存中,而是從磁盤進行流式傳輸。巨大的性能提升。

+0

已經有虛擬內存來處理這個問題,所以我不會在意將內存從RAM轉移到磁盤,反之亦然。當您在應用程序代理中收到內存警告時,足以釋放部分內存。 –

+0

更好的方法是小心你的應用使用多少內存。我一直處於'didReceiveMemoryWarning'不足以保存應用程序不被拋棄的情況。如果你可以避免在內存中存儲20張圖像的數據,我會這麼說。 – MishieMoo

+0

@MishieMoo所以在fileURL我把文件的完整路徑? –

1

MishieMoo對於內存/流媒體的考慮和明智的建議是絕對正確的,以避免一次將所有圖像加載到內存中。

雖然我想回到UIImageNSData的問題。在我看來,有兩個方面的考慮:

  1. 文件大小:不幸的是,沒有簡單的答案是原始圖像是否會比UIImage/UIImagePNGRepresentation輸出較小。有時,如果原始文件是JPEG格式,通過UIImage將圖像往返跳動的結果實際上可以使文件變大(例如,我只抓取了三張圖像,PNG往返將它們從4.7mb移動到了38.9mb)。但是,如果原件是未壓縮的圖像,那麼PNG往返可能會使它們變得更小。

  2. 數據丟失:對我來說,通過UIImage往返圖像的更重要的問題是您將遭受數據丟失。你失去元數據。根據圖像的不同,甚至可能會丟失翻譯中的圖像數據(例如,如果原稿不在sRGB色彩空間中,如果位深度降低等)。

現在,有時它非常有意義(例如,I圖像創建縮略圖時使用此UIImage往返技術的變化)。但如果我的意圖是將圖像上傳到服務器上,我會非常謹慎地通過UIImage轉換,可能會丟失數據,沒有引人注目的商業案例。