NSFileWrapper是否将所有内容加载到内存中?

时间:2012-11-29 08:20:48

标签: ios uidocument nsfilewrapper

假设我有一个NSFileWrapper目录。该目录由多个级别的目录和文件组成。有些文件很大。所有这些文件都加载到内存中,还是懒得加载?

如果将它们加载到内存中,是否有NSFileWrapper的替代方法具有类似的功能,不会将文件加载到内存中?我可以挂钩UIDocument吗?


这适用于基于文档的应用程序,该应用程序使用与iCloud同步的UIDocument。文档可以在其中嵌入图像和视频。每个图像/视频都有一个HTML文档中显示的预览图像(缩略图)。全尺寸图像或视频不应加载到内存中,而应按需加载。

我还需要一种方法来添加资源而不将其加载到内存中。像“initWithAsset:(ALAsset *)”这样的东西是理想的。

2 个答案:

答案 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的主要用例是将文件嵌入到文档中,您可能始终需要访问所述文件。

您正在尝试使用文件包装器?我假设如果您要映射整个目录,则不一定要将媒体嵌入到文档中,但也许我错了。如果您可以更多地谈论您的用例,那么这将影响您可能采用的替代方案。