具有自动保存功能的 CoreData 第一次保存,然后在所有后续自动保存中以“NoSuchFileError”崩溃

Posted

技术标签:

【中文标题】具有自动保存功能的 CoreData 第一次保存,然后在所有后续自动保存中以“NoSuchFileError”崩溃【英文标题】:CoreData with autosave saves 1st time, then crashes with "NoSuchFileError" on all following autosaves 【发布时间】:2011-05-08 21:35:12 【问题描述】:

使用 CoreData 的基于 NSDocument 的应用程序。非常简单 - 两个实体,具有一对多的关系。此应用与保存、加载等完美配合。

然后我像这样打开自动保存:

[[NSDocumentController sharedDocumentController] setAutosavingDelay:0.1];

...然后它立即出现了可怕的错误。

第一次自动保存有效,100% 正确。即,它将文件保存在用户的私有目录中,如果您退出应用程序并重新启动,则 autosaved-doc 会自动重新打开。酷!

但是,一旦您对数据进行第二次更改,自动保存就会崩溃,原因如下:

error = Error Domain=NSCocoaErrorDomain Code=134030 UserInfo=0x1001a1be0 "An error occurred while saving."
 Underlying Error=(Error Domain=NSCocoaErrorDomain Code=4 UserInfo=0x10019a840 "The file doesn’t exist."
 Underlying Error=(Error Domain=NSPOSIXErrorDomain Code=2 UserInfo=0x100150d00 "The operation couldn’t be completed. No such file or directory"))

...这对我来说毫无意义。为什么 auto*SAVE* 会关心文件是否存在?为什么它第一次可以工作,然后又失败了?

注意:我已经检查过,Apple 尝试在第二次自动保存调用中使用相同的文件名 - 如果它第一次工作,为什么它在 0.5 秒后失败???

【问题讨论】:

【参考方案1】:

您为什么要尝试每秒自动保存十次?这太频繁了。实际保存文件可能需要超过十分之一秒的时间。更合理的值是 10 秒,这可能比实际需要的频率更高。

【讨论】:

我对文档的理解是,在保存时,它不会再次自动保存(除非在保存时修改了某些数据?)。 0.1 秒是为了让测试/调试更快,我认为它不会影响保存是否有效 - 你认为这是原因吗?【参考方案2】:

字里行间,这似乎是 Apple 使用 NSDocument 实施 Core Data 的一个已知缺陷:自动保存已损坏,他们不打算修复它。

来自 NSPersistentDocument(在项目创建时选择 Core Data 和 NSDocument 时使用的 NSDocument 的子类):

“保存到...”和自动保存不是 直接支持——Core Data 不能 保存到商店并保持不变 管理对象中的更改状态 上下文,同时保持一个 未保存的堆栈作为当前文档。

有趣的说法是“Core Data 不能......” - 当然,CD“可以”做到这一点,尽管我可以看到它可能需要大量代码并跳过箍以使其工作。听起来更像是借口而不是解释。

【讨论】:

以上是关于具有自动保存功能的 CoreData 第一次保存,然后在所有后续自动保存中以“NoSuchFileError”崩溃的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 不将数据保存到数据库

具有自定义类类型的 Swift CoreData 保存属性

Swift CoreData,通过多对多关系保存数据

如何在具有自动保存功能的网站上设计 api 端点?

通过将新项目保存到具有继承的过滤获取请求的CoreData错误

视图控制器仅在第一次保存到 coredata 时填写我的表单