【问题标题】:Does NSFileWrapper support lazy loading?NSFileWrapper 是否支持延迟加载?
【发布时间】:2013-03-25 15:27:28
【问题描述】:

我正在创建一个 NSDocument 包,其中可能包含数百个大文件,因此我不想在打开文档时全部阅读。

我花了一些时间搜索,但找不到明确的答案。大多数人似乎认为NSFileWrapper 将所有数据加载到内存中,但有些人表示它不会加载数据,直到您在包装器上调用-regularFileContents。 (例如,请参阅Does NSFileWrapper load everything into memory?Objective-C / Cocoa: Uploading Images, Working Memory, And Storage。)

文档并不完全清楚,但 NSFileWrapperReadingImmediateNSFileWrapperReadingWithoutMapping 之类的选项似乎表明它并不总是会读取所有内容。

我推测NSFileWrapper 支持增量保存,只写出已被替换的子包装器。所以如果它也支持增量加载就好了。

有确定的答案吗?

【问题讨论】:

    标签: macos cocoa lazy-loading nsdocument nsfilewrapper


    【解决方案1】:

    NSFileWrapper 默认延迟加载,除非您指定 NSFileWrapperReadingImmediate 选项。它将避免将文件读入内存,直到实际请求它为止。

    作为调试辅助,您可以通过以下检查来查看文件是否已加载:

    [wrapper valueForKey:@"_contents"];
    

    从磁盘读取文件后,它会填写为NSData

    【讨论】:

    • 谢谢,非常有帮助。我是否正确地认为如果我指定NSFileWrapperReadingWithoutMapping,那么-regularFileContents 将读取文件而不缓存它?我希望能够读取一堆 plist 而无需将它们保留在内存中。更好的是让它缓存它们,并有办法在不再需要时卸载/丢弃它们,但我没有看到任何方法。
    • 否,NSFileWrapperReadingWithoutMapping 控制是否应使用内存映射。无论哪种方式,覆盖文件的NSData 对象都将保留在
    • 在不解除分配的情况下“卸载”文件包装器的唯一方法是要求它再次从 URL 中读取。可以说这是经过深思熟虑的设计,因此在正常情况下,NSFileWrapper 的行为是半不变的;加载后,其属性不会恢复到早期/未知状态
    • 好的,谢谢。然后,我会尽量减少文件内容的加载(无论如何,这无疑是提高性能的好主意)。
    猜你喜欢
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多