假设我有一个NSFileWrapper
目录。该目录由多个级别的目录和文件组成。有些文件很大。所有这些文件都加载到内存中,还是懒得加载?
如果将它们加载到内存中,是否有NSFileWrapper
的替代方法具有类似的功能,不会将文件加载到内存中?我可以挂钩UIDocument
吗?
这适用于基于文档的应用程序,该应用程序使用与iCloud同步的UIDocument
。文档可以在其中嵌入图像和视频。每个图像/视频都有一个HTML文档中显示的预览图像(缩略图)。全尺寸图像或视频不应加载到内存中,而应按需加载。
我还需要一种方法来添加资源而不将其加载到内存中。像“initWithAsset:(ALAsset *)”这样的东西是理想的。
答案 0 :(得分:9)
我刚刚制作了一个应用程序来生成一个视频。然后使用UIDocument子类将此视频保存为特定的文件格式。
执行contentsForType:error:
时使应用程序内存不足的唯一方法是将视频输出到tmp目录中的文件,并使用NSFileWrapperReadingWithoutMapping
的视频网址初始化文件包装器-option以防止它将视频加载到内存中,只是复制到文件中。
- (id)contentsForType:(NSString *)typeName error:(NSError **)outError {
if (self.fileWrapper == nil) {
self.fileWrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:nil];
}
if (self.videoURL != nil) {
NSError *fileReadError;
NSFileWrapper *videoFileWrapper = [[NSFileWrapper alloc] initWithURL:self.videoURL options:NSFileWrapperReadingWithoutMapping error:&fileReadError];
if(fileReadError){
NSLog(@"File read error: %@", [fileReadError localizedDescription]);
}else {
[videoFileWrapper setPreferredFilename:@"video.mov"];
[self.fileWrapper addFileWrapper:videoFileWrapper];
}
}
//...
}
答案 1 :(得分:5)
文档中并不完全清楚,但我99%肯定NSFileWrapper
将内存映射所有内容。 NSFileWrapper
的主要用例是将文件嵌入到文档中,您可能始终需要访问所述文件。
您正在尝试使用文件包装器?我假设如果您要映射整个目录,则不一定要将媒体嵌入到文档中,但也许我错了。如果您可以更多地谈论您的用例,那么这将影响您可能采用的替代方案。