我应该多久保存一次Core Data?

问题描述:

我正在研究由Core Data支持的应用程序。 现在,我正在将对象上下文保存为当我向上下文添加或删除实体时。我恐怕会影响表现,所以我想延期保存。事实上,我可以一直推迟它直到应用程序终止。 仅当应用程序即将关闭时才保存数据风险太大?我应该多久调用一次Object Context保存?我应该多久保存一次Core Data?

我想有一个单独的线程处理保存:它会等待一个信号。每当应用程序的任何部分调用helper/util方法来保存核心数据时,它都会减少信号量。当它降到零时,“保存线程”将执行一次保存,并将信号量增加到5,然后再次睡眠。

有什么好的建议吗? 谢谢!

您应该经常保存。保存操作的实际性能与您正在使用的持久存储类型有很大关系。由于二进制和XML存储是原子的,因此每次保存时都需要将其彻底重写到磁盘。随着对象图的增长,这可能会真的减慢你的应用程序。另一方面,SQLite存储更容易以增量方式编写。因此,虽然会有一些东西被写入超出了要保存的对象的范围,但开销远远低于原子存储类型。无论总体对象图大小如何,仅影响少数对象的保存总是很快。这就是说,如果你在一个循环中导入数据,比如说,我会等到完成操作的结束后才进行保存,而不是保存每次迭代。您的主要目标应该是防止数据丢失。 (我发现用户并不关心这一点!)性能应该是紧随其后的。您可能需要做一些工作来平衡保存频率和性能,但是您上面概述的解决方案似乎过度杀毒,除非您确定了特定的重要性能问题。

+0

感谢您的快速回答。我的对象不是很大,但对象有点复杂。底层商店是SQLite,所以如你所说,它应该是相当好的。 我最近遇到一个额外的问题:我在上下文中创建一个实体对象并保存。在短时间内,如果我删除该实体(稍后使用FetchedResultsController检索),则会出现与内部一致性有关的错误。我认为这是因为上下文没有更新内存中的对象图? – Justin 2010-06-22 02:40:34

+1

我想补充一点,你想让你的实际保存频率变成一个变量或'#define',这样一旦你在测试中,你可以微调你的保存频率并在乐器中观看结果。 – 2010-06-22 15:43:20

我认为最好的办法就是保存每个对象后。如果有事情发生,比如突如其来的崩溃,什么都不会丢失。

一些性能增强功能,如果添加大量对象就是批量处理。将所有对象添加到上下文而不是保存。例如,如果您在循环中添加大量对象,这是很好的。你的想法很相似,但是在保存之间可能会有很长时间,程序可能会崩溃。

我不认为添加单个对象会是一个很大的性能问题。你的对象有多大,它们是否包含大量数据?

+0

每次崩溃后都不要保存。这杀死了表现。 – 2010-06-22 15:42:32

+1

每次崩溃后保存?我认为这是一个错字。 当然,如果用户通过创建对象来指定保存,则用户无法快速创建对象以减慢应用程序的速度。 如果您认为它会减慢应用程序的运行速度,导致无法节省足够的风险。请提供证据,我所有的基准都可以接受。 – 2010-06-23 08:17:20