0

我正在从 Parse 下载 2400x1600 图像,我不希望它一次将所有数据保存在内存中。Parse 的 PFFile 对象有一个方便的方法来获取 NSData 作为 NSInputStream,所以当最终下载数据时,我最终得到一个 NSInputStream。所以现在我想使用那个 NSInputStream 来获取我的 UIImage。它应该像使用文件方法的内容创建 UIImage 一样工作,即不是将整个图像一次加载到内存中。我认为从 NSInputStream 写入文件然后使用 UIImage 的文件内容方法在我的情况下应该可以正常工作,但是我发现无法从 NSInputStream 写入文件。

任何代码示例或一些指南将不胜感激。

提前致谢。

4

2 回答 2

1

为此,您可以设置一个NSOutputStream然后将接收到的数据流式传输到文件。使用 with YES 创建您的输出流initToFileAtPath:append:进行追加。在您的输入流回调中,通过调用将数据传递到您的输出流write:maxLength:在文档中阅读更多内容)。流完成后,您就可以将完整的图像保存在文件中,而无需将其完全保存在内存中。

由于您使用的是 Parse,因此 Henri 上面的回答更合适,但这是通用解决方案。

于 2014-01-13T18:50:09.257 回答
1

iOS/OS X 的文档中,Parse 举了一个例子。

取回图像涉及调用 PFFile 上的 getData 变体之一。在这里,我们从另一个名为 anotherPhoto 的 UserPhoto 中检索图像文件:

PFFile *userImageFile = anotherPhoto[@"imageFile"];
[userImageFile getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) {
    if (!error) {
        UIImage *image = [UIImage imageWithData:imageData];
    }
}];

现在,我不太明白你使用 NSInputStream 的原因,主要有两个原因:

  1. NSInputStream 应该是用于输入数据,而不是从某个地方获取它
  2. NSInputStream 用于流式传输,因此对于您想要对传入的数据执行某些操作的场景,根据您的描述,您似乎只在数据完成下载后才关心数据。

简而言之,您应该使用上述方式,除非您真正关心数据的加载方式,例如想要在数据进入时对其进行操作(在您描述的情况下极不可能)。

至于一次将所有内容都保存在内存中,您提供的尺寸并没有那么大,是的,您可以将其流式传输到文件中,但假设您想在应用程序中显示它的全尺寸,内存问题会出现在某些地方尽管如此,你只会推迟不可避免的事情。如果不是这种情况(不显示全尺寸),那么最好将源图像切成小块并使用它们,这样可以更快地下载特定的图块并且更容易占用内存。

于 2014-01-13T18:51:24.430 回答