Ios 来自NSInputStream的UIImage
我正在从Parse下载一个2400x1600的图像,我不希望它同时在内存中保存所有数据。Parse中的PFFile对象有一种方便的方法,可以将NSData作为NSInputStream获取,因此当数据最终下载时,我最终得到一个NSInputStream。 所以现在我想使用NSInputStream来获取我的UIImage。它的工作原理应该类似于使用file方法的内容创建UIImage,即不是一次将整个图像加载到内存中。 我认为从NSInputStream写入文件,然后使用UIImage的contents of file方法在我的例子中应该可以很好地工作,但是我没有找到从NSInputStream写入文件的方法 任何代码示例或指南都将不胜感激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
提前感谢。要完成此操作,您可以设置一个
NSOutputStream
,然后将接收到的数据流式传输到一个文件中。使用initToFileAtPath:append:
创建输出流,并为append添加YES。在输入流回调中,通过调用write:maxLength:
()将数据传递到输出流。一旦流完成,您就可以将完整图像保存在文件中,而不必将其完全保存在内存中
Henri上面的回答更合适,因为您使用的是Parse,但这是一般的解决方案。在中,Parse提供了一个示例
检索回映像需要调用PFFile上的一个getData变量。在这里,我们从另一个名为anotherPhoto的UserPhoto检索图像文件:
现在,我不太明白您使用NSInputStream的原因,主要有两个原因:
至于一次将其全部存储在内存中,您给出的维度没有那么大,是的,您可以将其流式存储到文件中,但假设您希望在应用程序中显示其全尺寸,那么内存问题将在某个时候出现,即您将推迟不可避免的事件。如果情况并非如此(不显示全尺寸),则最好将源图像切碎为分片,然后使用这些分片,下载特定分片的速度更快,内存也更轻松。当然,当您显示整个图像时,整个图像都会存储在内存中。显示大小可能约为15MB,是下载大小的许多倍。
PFFile *userImageFile = anotherPhoto[@"imageFile"];
[userImageFile getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) {
if (!error) {
UIImage *image = [UIImage imageWithData:imageData];
}
}];