连续更新值绑定选项会触发连续autosaveInPlace尝试(对于您键入的每个单个字符)。如何防止连续更新值绑定选项的连续autosaveInPlace
大家好,这是我的第一个问题!
我希望我会正确地问它... :)
我想狮自动保存机制添加到我的核心数据基于文档的应用程序。 在我的NSPersistentDocument子类中,我重写了+(BOOL)autosaveInPlace
方法返回YES
,并且所有功能都正常工作(保存,新菜单,版本浏览器...)。
我的问题是,当我使用连续更新值选项键入绑定到我的模型的文本字段时,自动保存系统会在每次单击按键时触发保存操作!旋转的沙滩球没有出现(可能是因为我的文档相当小),但打字真的很慢。
AutosaveInPlace
被称为每按键,然后saveToURL…
和writeToURL…
方法。
在网络上我几乎没有发现任何问题,甚至在Apple官方文档中也没有发现。
在自动保存和版本WWDC '11视频工程师提供了如何取消自动保存不完整的例子,当[self autosavingIsImplicitlyCancellable]
回报YES
,但对我来说,这个方法总是返回NO
。这必须是预期的行为:该值必须不断更新,并且由于磁盘上的文件必须始终与用户在屏幕上看到的内容相同,因此不能取消该保存。
我发现了一个更有用的例子,如何防止首先启动保存(包括save…
方法而不是write…
之一)。
-(void)saveToURL:(NSURL *)url
ofType:(NSString *)typeName
forSaveOperation:(NSSaveOperationType)saveOperation
completionHandler:(void (^)(NSError *errorOrNil))completionHandler {
if (saveOperation == NSAutosaveInPlaceOperation) {
if ([self isWritingInMyTextField]) {
completionHandler([NSError errorWithDomain:NSCocoaErrorDomain
code:NSUserCancelledError
userInfo:nil]);
return;
}
}
[super saveToURL:url ofType:typeName forSaveOperation:saveOperation completionHandler:completionHandler];
}
这是行得通的。在自动保存的情况下,如果我的文本字段具有焦点,我将记录的沉默可可错误传递给完成处理程序,并且不会发生保存,UI的响应与以前一样。原始海报声称,这种方式实际上自动保存延迟到当前活动结束,但我不确定。
我的问题是,我不希望必须观察每一个文本字段的开始/结束编辑,并且必须手动触发一个自动保存我自己每隔一段时间,因为我阻止系统做它,而我正在写文本字段。系统应该明白,在单个按键的基础上触发保存是不合理的。
在WWDC '11视频中,工程师指出通过NSRunLoop
和事件检查用户活动的方式,但这远远超出我的理解范围。我搜索了文档NSRunLoop
,NSEvent
,但我无法弄清楚如何获取信息«用户主动输入内容!»。
如果有人能指出我在这个主题的正确方向,我会很感激。
如果有人知道推荐的处理这个问题的方法会更好!作为最后的考虑,我可以在NSPersistentDocument的文档中看到“NSPersistentDocument不支持NSDocument的异步保存API,因为该API需要访问多线程上的文档状态,并且违反了NSManagedObjectContext的要求”。这是否意味着,除非你的应用程序的文档很小,否则根本不应该使用自动保存? 好吧,苹果似乎希望autosave成为所有新应用程序的新事物,所以我无法弄清楚如果开发人员必须放弃核心数据才会发生这种情况。
为什么不重写autosavingIsImplicitlyCancellable以返回YES? – sosborn
我会试试看,谢谢! – wdyp