我想在我的 NSDocument 中实现异步保存。根据文档,我需要返回 YES ,canAsynchronouslyWriteToURL:ofType:forSaveOperation:
然后unblockUserInteraction
在写作期间调用。
在我的文档中,写入是fileWrapperOfType:error:
通过简单地返回一个 NSFileWrapper 来执行的。
- (NSFileWrapper*) fileWrapperOfType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {
return self.myMutableFileWrapper;
}
关于这一点,文档说:
例如,fileWrapperOfType:error: 的默认实现在创建要返回的 NSFileWrapper 对象时调用 [unblockUserInteraction]。假设 NSFileWrapper 没有被后续的用户操作改变,它实际上是文档内容的“快照”,一旦它被创建,它就可以安全地在主线程上继续处理用户事件,即使其中一些用户事件可能在安全写入 NSFileWrapper 对象之前更改文档的内容。
目前在我的代码self.myMutableFileWrapper
中可以更改 after fileWrapperOfType:error
,所以我不能假设它不会像文档所说的那样发生突变。
这是否意味着我应该修改fileWrapperOfType:error:
以复制我的文件包装器,然后调用unblockUserInteraction
?像这样的东西:
- (NSFileWrapper*) fileWrapperOfType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {
NSFileWrapper *copyFileWrapper = MakeACopyOf(self.myMutableFileWrapper);
[self unblockUserInteraction];
return copyFileWrapper;
}
如果以上是正确的,我如何制作一个 NSFileWrapper 的副本?此外,制作一个可能巨大的 NSFileWrapper 的副本不会否定异步保存的性能优势吗?