7

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

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


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

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

4

2 回答 2

9

不久前我制作了一个生成视频的应用程序。然后使用 UIDocument 子类将此视频保存为特定的文件格式。

使应用程序在执行时不会耗尽内存的唯一方法contentsForType:error:是将视频输出到 tmp 目录中的文件,并使用NSFileWrapperReadingWithoutMapping-option 使用视频的 url 初始化文件包装器,以防止它将视频加载到内存中,而只是复制到文件中。

- (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];
            }        

        }
//...
}
于 2014-02-27T11:01:54.667 回答
6

从文档中并不完全清楚,但我 99% 肯定NSFileWrapper会记忆映射所有内容。的主要用例NSFileWrapper是将文件嵌入文档中,您可能需要始终访问所述文件。

你想用文件包装器做什么?我假设如果您要映射整个目录,则不一定要将媒体嵌入文档中,但也许我弄错了。如果您可能会更多地谈论您的用例,因为这将影响您可能选择的替代方案。

于 2012-11-29T10:19:16.947 回答