Ios 来自NSInputStream的UIImage

Ios 来自NSInputStream的UIImage,ios,objective-c,parsing,uiimage,nsinputstream,Ios,Objective C,Parsing,Uiimage,Nsinputstream,我正在从Parse下载一个2400x1600的图像,我不希望它同时在内存中保存所有数据。Parse中的PFFile对象有一种方便的方法,可以将NSData作为NSInputStream获取,因此当数据最终下载时,我最终得到一个NSInputStream。 所以现在我想使用NSInputStream来获取我的UIImage。它的工作原理应该类似于使用file方法的内容创建UIImage,即不是一次将整个图像加载到内存中。 我认为从NSInputStream写入文件,然后使用UIImage的cont

我正在从Parse下载一个2400x1600的图像,我不希望它同时在内存中保存所有数据。Parse中的PFFile对象有一种方便的方法,可以将NSData作为NSInputStream获取,因此当数据最终下载时,我最终得到一个NSInputStream。 所以现在我想使用NSInputStream来获取我的UIImage。它的工作原理应该类似于使用file方法的内容创建UIImage,即不是一次将整个图像加载到内存中。 我认为从NSInputStream写入文件,然后使用UIImage的contents of file方法在我的例子中应该可以很好地工作,但是我没有找到从NSInputStream写入文件的方法

任何代码示例或指南都将不胜感激


提前感谢。

要完成此操作,您可以设置一个
NSOutputStream
,然后将接收到的数据流式传输到一个文件中。使用
initToFileAtPath:append:
创建输出流,并为append添加YES。在输入流回调中,通过调用
write:maxLength:
()将数据传递到输出流。一旦流完成,您就可以将完整图像保存在文件中,而不必将其完全保存在内存中

Henri上面的回答更合适,因为您使用的是Parse,但这是一般的解决方案。

在中,Parse提供了一个示例

检索回映像需要调用PFFile上的一个getData变量。在这里,我们从另一个名为anotherPhoto的UserPhoto检索图像文件:

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

  • NSInputStream被认为是用于输入数据,而不是从某处获取数据
  • NSInputStream是用于流式传输的,因此对于您希望在数据进入时对其进行处理的场景,从您的描述来看,似乎您只关心数据完成下载后的情况
  • 简而言之,您应该使用前面提到的方法,除非您真正关心数据的加载方式,例如希望在数据进入时对其进行操作(在您描述的情况下,这种情况非常不可能)


    至于一次将其全部存储在内存中,您给出的维度没有那么大,是的,您可以将其流式存储到文件中,但假设您希望在应用程序中显示其全尺寸,那么内存问题将在某个时候出现,即您将推迟不可避免的事件。如果情况并非如此(不显示全尺寸),则最好将源图像切碎为分片,然后使用这些分片,下载特定分片的速度更快,内存也更轻松。

    当然,当您显示整个图像时,整个图像都会存储在内存中。显示大小可能约为15MB,是下载大小的许多倍。
    PFFile *userImageFile = anotherPhoto[@"imageFile"];
    [userImageFile getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) {
        if (!error) {
            UIImage *image = [UIImage imageWithData:imageData];
        }
    }];