iCloud Drive下NSDocument.revert异常:仅打开文件即触发不必要重载
问题解答
这是NSDocument结合iCloud Drive同步时的预期行为,背后是苹果对文件元数据变更的监听逻辑设计:
- 当iOS端打开iCloud中的文档时,系统会更新该文件的
NSURLContentAccessDateKey(访问日期)和NSURLAttributeModificationDateKey(属性修改日期)这类元数据。 - Mac端的NSDocument会监听iCloud文件的所有元数据变更,默认认为元数据变化可能伴随内容变更,因此会触发
revert(toContentsOf:ofType:)方法,确保文档状态与云端同步——哪怕实际文件内容没有修改。
优化方案:避免不必要的内容重载
如果想仅在内容真的变更时才执行重载逻辑,可以在revert(toContentsOf:ofType:)中添加前置判断:
- 读取当前文档的内存内容,与文件的磁盘内容做对比(比如计算哈希值、直接比对数据)。
- 若内容完全一致,直接跳过重载流程;若存在差异,再执行官方默认的revert逻辑。
示例伪代码:
override func revert(toContentsOf url: URL, ofType typeName: String) throws { // 获取当前内存中的文档内容 let currentContent = self.currentDocumentData() // 读取磁盘上的文件内容 let diskContent = try Data(contentsOf: url) if currentContent == diskContent { // 内容无变化,跳过重载 return } // 内容有变化,执行默认revert逻辑 try super.revert(toContentsOf: url, ofType: typeName) }
注意事项
自定义判断时要注意iCloud同步的延迟性,确保在元数据变更时,磁盘上的内容已经完成同步,避免出现误判。同时不要完全忽略元数据变更,某些场景下元数据变化确实关联内容修改(比如第三方工具修改文件后更新属性)。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

