繁体   English   中英

来自NSInputStream的UIImage

[英]UIImage from NSInputStream

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

任何代码示例或一些指南都将非常感激。

提前致谢。

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

由于你正在使用Parse,因此Henri的上述答案更合适,但这是一般解决方案。

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应该用于INPUTTING数据,而不是从某个地方获取数据
  2. NSInputStream用于流式传输,因此对于您希望对数据进行处理的场景,从您的描述中看起来好像您只有在完成下载后才关注数据。

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

至于把它全部放在内存中,你提供的尺寸不是很大,是的,你可以将它流式传输到一个文件中,但假设你想在应用程序中显示它的全尺寸,内存的问题会出现在某些尽管如此,即你只是推迟不可避免的事情。 如果不是这种情况(不显示全尺寸),那么将源图像切割成瓷砖并使用它们可能是个好主意,可以更快地下载特定的瓷砖并更容易记忆。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM