我正从iOS应用程序向我的服务器上传功能。我现在正在构建最好的方法,并认为我的方法会遇到麻烦。
我希望使用AFmultiparFormData
中AFNetworking
的1个请求发送超过20张图片,并提供与该图片相关的文字信息。
现在......我知道如何创建包含大量信息的NSDictionary
,但从未创建NSDictionary
包含NSData
格式的20张图片,或者尝试一次上传多张图片。
问题是我不知道NSData
图像是否会占用与图像一样多的内存空间。因此,我当时只能做2/3(如果它们是全屏图像,它们不是,但它只是一个任意的测量点)
鉴于我所说的和下面的seudo代码,我可以这样做,还是我的内存不足?否则我会留下1比1做。
// for loop that does this 20 times
UIImage* image = [UIImage imageNamed:myExercise.exercisePictureThumb];
NSData * exercisePictureThumb = UIImagePNGRepresentation(image1);
// add to dictionary recursively
答案 0 :(得分:5)
您不应将所有图像数据放入NSDictionary
,因为这可能会导致内存问题。
相反,请为您的文件创建字典或网址数组,然后使用AFNetworking的multipartFormRequestWithMethod:path:parameters:constructingBodyWithBlock:
和AFMultipartFormData protocol
,尤其是appendPartWithFileURL:name:fileName:mimeType:error:
。这样,所有图像的图像数据一次不会全部存储在内存中,而是从磁盘流式传输。巨大的性能提升。
答案 1 :(得分:1)
MishieMoo在内存/流媒体方面的考虑是绝对正确的,也是避免一次性将所有图像加载到内存中的明智建议。
我想回到你的UIImage
vs NSData
问题。在我看来,有两个注意事项:
文件大小:不幸的是,关于原始图片是否小于UIImage
/ UIImagePNGRepresentation
输出,没有简单的答案。有时,如果原始文件是JPEG,则通过UIImage
往返图像的结果实际上可以使文件更大(例如,我只抓取了三个图像,PNG往返从4.7mb到38.9mb )。但是,如果原件是未压缩的图像,那么PNG往返可以使它们相当小。
数据丢失:对我而言,通过UIImage
对图片进行往返式运算的一个更重要的问题是,您将遭受数据丢失。你丢失了元数据。根据图像,您甚至可以在翻译中丢失图像数据(例如,如果原始文件没有在sRGB色彩空间中,如果位深度降低等)。
现在,有时它非常有意义(例如,我在创建图像缩略图时使用此UIImage
往返技术的变体)。但是,如果我的意图是将图像上传到服务器上,我会非常谨慎地进行UIImage
转换,可能会丢失数据,而不会出现令人信服的商业案例。