2

我正在从我的 iOS 应用程序向我的服务器执行上传功能。我现在正在设计最好的方法来做到这一点,并认为我的方法会遇到麻烦。

我有超过 20 张图片,我想在 1 个请求中使用AFmultiparFormDataAFNetworking该图片相关的文本信息发送。

现在...我知道如何在NSDictionary里面创建包含大量信息的图片,但从未创建过NSDictionary包含 20 张图片NSData格式的图片,也从未尝试一次上传多张图片。

问题是我不知道NSData图像是否会占用与图像一样多的内存空间。因此,我当时只能做 2/3(如果它们不是全屏图像,但它只是一个任意的测量点)

鉴于我所说的和下面的伪代码,我可以这样做还是内存不足?否则我将被留下来做 1 比 1。

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

// add to dictionary recursively
4

2 回答 2

5

您不应该将所有图像数据放入 中NSDictionary,因为这可能会导致内存问题。

相反,为您的文件创建一个字典或 URL 数组,然后使用AFNetworkingmultipartFormRequestWithMethod:path:parameters:constructingBodyWithBlock:和. 这样一来,所有图像的图像数据不会一次全部在内存中,而是从磁盘流式传输。性能大幅提升。AFMultipartFormData protocolappendPartWithFileURL:name:fileName:mimeType:error:

于 2013-06-05T19:10:31.073 回答
1

MishieMoo 关于内存/流媒体的考虑和避免一次将所有图像加载到内存中的明智建议是绝对正确的。

不过,我想回到你的UIImagevsNSData问题。在我看来,有两个考虑:

  1. 文件大小:不幸的是,对于原始图像是否会小于UIImage/UIImagePNGRepresentation输出,没有简单的答案。有时,如果原始文件是 JPEG,通过 a 来回传输图像的结果UIImage实际上会使文件变大(例如,我刚刚抓取了三张图像,而 PNG 往返使它们从 4.7mb 变为 38.9mb)。但是,如果原始图像是未压缩的图像,那么 PNG 往返可能会使它们变得更小。

  2. 数据丢失:对我来说,往返图像的更重要问题UIImage是您将遭受数据丢失。您丢失了元数据。根据图像的不同,您甚至可能在转换过程中丢失图像数据(例如,如果原始图像不在 sRGB 颜色空间中,如果位深度降低等)。

现在,有时它非常有意义(例如,我UIImage在创建图像缩略图时使用了这种往返技术的变体)。但是,如果我的意图是将图像上传到服务器上,那么在没有令人信服的商业案例的情况下,我会非常谨慎地进行UIImage转换,可能会丢失数据。

于 2013-06-06T02:16:58.650 回答