核心数据 - 在后台保存到磁盘上的持久存储

时间:2010-11-04 10:30:13

标签: objective-c macos core-data

我希望有人能够快速回答这个问题,这可能是一个非常明显的答案,但我无法理解它。

我有一个应用程序,对于mac,我在其中使用Core Data来保存信息。一切正常,当我创建新数据时,它在应用程序中显示正常,当我退出应用程序时,[managedObjectContext save:& error]被成功调用,数据被存储到磁盘上的持久存储中。

我要做的是在任何信息发生变化时随时保存到核心数据。这背后的原因是为了防止应用程序崩溃时数据丢失,并且因为我将为用户提供存储在dropbox / idisk上的选项,所以立即保存信息会很好,因为更改应该显示在他们正在访问相同数据的其他计算机。

到目前为止,我已经使用NSNotificationCenter找到了以下内容:

[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(saveDatabaseInBackground)
name:NSManagedObjectContextObjectsDidChangeNotification
object:managedObjectContext];

每当数据发生变化时,成功调用:

- (void) saveDatabaseInBackground
{
    NSError *error = nil;
    if ([managedObjectContext hasChanges])
    {
        [managedObjectContext save:&error];
    }
}

但是,似乎在托管对象上下文中调用save方法会导致发布相同的通知,从而导致无限循环并导致崩溃。

任何人对如何解决都有任何想法?

谢谢,

罗布

1 个答案:

答案 0 :(得分:1)

使用该通知无法保存您的托管对象。 NSManagedObjectContextObjectsDidChangeNotification在processPendingChanges期间,在处理完更改之后,但在安全调用save之前发布。如果你尝试,你会产生一个无限循环 - 正如你所发现的那样。有关通知的文档中提到了这一点。

您的要求是自动保存数据,以便在崩溃期间不会丢失任何内容。我为我的应用程序进行了类似的处理 - 在应用程序商店中排名前50位的生产力,还包括保管箱同步 - 并确定在大多数用例中我研究了几乎立即保存变化的数据通常足够好。而不是试图保存对象上的任何内容都被更改,为什么不每隔n秒检查一次更改并在必要时保存?设置计时器并检查isUpdated对象。这是相当简单的,但是有一些问题需要注意,例如如果保存已在进行中则不尝试保存。在与dropbox等服务同步时尤其重要,这可能需要很长时间才能同步。

如果您需要有关设置计时器的更详细代码,请检查托管对象并保存,我将很乐意这样做。