2011-06-01 46 views
1

In this question, octy wrote如何防止NSManagedObjectContext在保存时线程死亡时损坏数据库?

顺便说一句,如果你保存在后台 线程,你还需要考虑什么 发生在你的应用程序被终止,同时 保存操作正在进行中。 后台线程被kill 远程,而看门狗等待5 秒为主线程完成 了。

现在我花了整天的时间来实现NSOperation并直接在NSOperation子类中创建NSManagedObjectContext实例,因此每个NSOperation都拥有它自己的非共享MOC。但是现在这是一个非常糟糕的消息,因为这种可能会一直发生的情况会破坏核心数据库。我的意思是它不能开始在sqlite3文件中写入一个半字节的东西,然后立即停止。

然后还有另一个问题:在我的NSOperations中,我也使用NSFileManager做文件I/O。

那么我能做些什么呢?我必须在应用程序中跟踪所有正在运行的NSOperations和NSOperationQueues,并在应用程序终止时快速在App Delegate中处理它们,以便我可以将NSOperations告诉SFF(Save F ***** g Fast)或取消所有操作,抓住他们的MOC并立即“硬保存”它们?解决这个问题的最佳做法是什么?

为什么我第一次听到我的职业生涯?我的意思是NSOperationQueue和核心数据中没有一个提到书籍甚至提到这个问题,但它似乎是一个随机的应用杀手,如果我们不明确地关心这个问题,它会强制用户重新安装(并可能丢失大量数据)。

+0

我开发了这个NSOperation子类来完成你所说的https://github.com/veritech/FRCoreDataOperation。在我的应用程序平均运行期间,我将创建超过100个在串行NSOperationQueue中运行的这些应用程序。而且,当应用程序终止/后台服务时,我会取消所有操作,并且我从来没有发生过腐败问题。随意看看课程,也许它可以帮助你。 – Jonathan 2011-06-02 00:24:02

+0

您必须在保存操作中取消*,因为它可能发生在现实中。这是真正的问题。 – 2011-06-03 10:50:04

回答

1

MOC的主要功能是表示与格式无关的抽象存储。它将所有对象存储在内存中,并使用事务机制来提交任何更改。所以当你插入/删除/编辑MOC中的某些对象时,它们只会在内存中更改,而不会在持久存储中更改(无论是SQLite数据库,XML文件还是其他)。只有在调用​​方法时才会执行更改。

至于NSOperation和文件处理:如果你想停止一些操作,你应该为此调用cancel。来自文档:

此方法不会强制您的 操作代码停止。相反,它 更新对象的内部标志为 反映状态的变化。如果 操作已完成 执行,则此方法不起作用。 取消当前在操作队列中的 的操作,但 尚未执行,这使得 可能比平常更快地从队列 中删除操作。

这意味着如果有一些IO操作在您取消操作时运行,操作会一直等到它完成。

尽管核心数据事务机制,你应该实现你自己的一个不受它管理的数据(如果需要)。

+0

我的问题还不够清楚:当线程死亡并且MOC *现在正在保存时*,是否会破坏数据库?当线程(MOC运行于其中)从一纳秒到另一线程死亡时,MOC如何在不破坏完整性或数据的情况下保存到存储中? – 2011-06-03 10:49:12

+0

保存过程也是一个交易。所以如果它在执行过程中被取消,那么所有的更改都会被丢弃,并且没有任何内容被损坏。 – Max 2011-06-03 22:05:25

相关问题