来自NSInputStream的UIImage

时间:2014-01-13 18:44:32

标签: ios objective-c parsing uiimage nsinputstream

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

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

要完成此操作,您可以设置NSOutputStream,然后将收到的数据流式传输到文件。使用initToFileAtPath:append:创建输出流,使用YES进行追加。在输入流回调中,通过调用write:maxLength:read more in the docs)将数据传递到输出流。一旦流完成,您就可以将完整的图像存档,而不必将其完全存储在内存中。

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

答案 1 :(得分:1)

documentation on 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用于流式处理,因此对于您希望对数据进行处理的场景,从您的描述中看起来好像您只有在完成下载后才关心数据。 / LI>

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

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