我正在从Parse下载2400x1600图像,我不希望它同时将所有数据保存在内存中。来自Parse的PFFile对象有一种方便的方法可以将NSData作为NSInputStream来获取,所以当数据最终被下载时,我将得到一个NSInputStream。所以现在我想使用那个NSInputStream来获得我的UIImage。它应该像创建一个包含文件方法内容的UIImage一样工作,也就是说,不是将整个映像一次性加载到内存中。我认为从NSInputStream写入文件,然后使用UIImage的文件内容方法在我的例子中应该工作得很好,但是我没有找到从NSInputStream写入文件的方法。
任何代码示例或一些指南都将是非常感谢的。
提前谢谢。
发布于 2014-01-13 18:50:09
为此,您可以设置一个NSOutputStream,然后将接收到的数据流到一个文件中。使用带有YES的initToFileAtPath:append:创建您的输出流。在输入流回调中,通过调用write:maxLength: (在文档中阅读更多内容)将数据传递给输出流。一旦流完成,您就可以将完整的图像保存在文件中,而不会将其完全存储在内存中。
由于您使用的是Parse,上述Henri的回答更合适,但这是一般的解决方案。
发布于 2014-01-13 18:51:24
在关于iOS/OS X的文件中,Parse给出了一个例子。
检索图像返回需要调用PFFile上的一个PFFile变体。在这里,我们从另一个名为UserPhoto的anotherPhoto检索图像文件:
PFFile *userImageFile = anotherPhoto[@"imageFile"];
[userImageFile getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) {
if (!error) {
UIImage *image = [UIImage imageWithData:imageData];
}
}];现在,我不太明白您使用NSInputStream的原因,主要有两个原因:
简而言之,您应该使用上述方式,除非您真正关心数据加载的方式,例如,希望在数据出现时对其进行操作(在您描述的情况下非常不可能)。
至于同时将它全部存储在内存中,你给出的尺寸没有那么大,是的,你可以把它流进一个文件中,但是假设你想在应用程序中显示它的全部大小,那么内存的问题就会在某个时候出现,也就是说,你只是在推迟不可避免的事情。如果情况并非如此(没有显示全尺寸),那么最好将源映像分割成块,然后使用这些图像,这样可以更快地下载特定的块,并且更容易在内存中使用。
https://stackoverflow.com/questions/21098912
复制相似问题