Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 核心数据-在后台保存到磁盘上的持久存储_Objective C_Macos_Core Data - Fatal编程技术网

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

Objective c 核心数据-在后台保存到磁盘上的持久存储,objective-c,macos,core-data,Objective C,Macos,Core Data,我希望有人能对这个问题提供一个快速的答案,这可能是一个非常明显的问题,但我就是想不起来 我有一个mac应用程序,我在其中使用核心数据来保存信息。一切正常,当我创建新数据时,它会显示在应用程序中。当我退出应用程序时,会成功调用[managedObjectContext save:&error],并将数据存储到磁盘上的永久存储中 我想做的是在任何信息发生更改时保存到核心数据。这背后的原因是为了防止应用程序崩溃时数据丢失,因为我将给用户提供存储在dropbox/idisk上的选项,所以立即保存信息会很

我希望有人能对这个问题提供一个快速的答案,这可能是一个非常明显的问题,但我就是想不起来

我有一个mac应用程序,我在其中使用核心数据来保存信息。一切正常,当我创建新数据时,它会显示在应用程序中。当我退出应用程序时,会成功调用[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方法似乎会导致发布相同的通知,从而导致无限循环并导致崩溃

有人对如何解决这个问题有什么想法吗

谢谢


Rob

使用该通知保存托管对象没有解决方案。NSManagedObjectContextObjectsIDChangeNotification是在processPendingChanges期间发布的,在处理更改之后,但在安全调用save之前。如果您尝试,您将生成一个无限循环——正如您所发现的那样。通知文件中提到了这一点

您的要求是自动保存数据,以便在崩溃期间不会丢失任何数据。我对我的应用程序也经历了类似的过程——它在应用商店的生产力排名前50位,还包括dropbox同步——并确定在我研究的大多数用例中,几乎立即保存更改后的数据通常就足够了。与其尝试保存对象上的任何更改,为什么不每n秒检查一次更改并在必要时保存?设置计时器并检查对象是否已更新。这相当简单,但也有一些问题需要注意,例如,如果已在进行保存,则不尝试保存。当同步到dropbox等服务时,这一点尤其重要,因为这些服务可能需要大量时间进行同步


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

使用该通知保存托管对象没有解决方案。NSManagedObjectContextObjectsIDChangeNotification是在processPendingChanges期间发布的,在处理更改之后,但在安全调用save之前。如果您尝试,您将生成一个无限循环——正如您所发现的那样。通知文件中提到了这一点

您的要求是自动保存数据,以便在崩溃期间不会丢失任何数据。我对我的应用程序也经历了类似的过程——它在应用商店的生产力排名前50位,还包括dropbox同步——并确定在我研究的大多数用例中,几乎立即保存更改后的数据通常就足够了。与其尝试保存对象上的任何更改,为什么不每n秒检查一次更改并在必要时保存?设置计时器并检查对象是否已更新。这相当简单,但也有一些问题需要注意,例如,如果已在进行保存,则不尝试保存。当同步到dropbox等服务时,这一点尤其重要,因为这些服务可能需要大量时间进行同步


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

这是一个公平的观点,谢谢你的回答。我已经考虑过这个选择,我想这对我来说是一个“退路”。如果这是不可能的,或者是不切实际的,那么公平地说,我只是认为这是可能的,因为对于某些人来说,这是一个多么明显的要求!我应该可以使用计时器等,我在商店里也有一些应用程序,所以我对objective-c相当熟悉,只是有点核心数据新手!相信我,我认为这对于几乎所有的核心数据使用来说都是一个明显的要求,我花了大量的时间寻找答案,我确信答案就在那里。看起来很容易。遗憾的是,没有。我考虑的替代实现是重要属性上的KVO,但在考虑了权衡之后——特别是结果代码的脆弱性和对象特定性——我决定反对它。这是一个公平的观点,感谢您的回答。我已经考虑过这个选择,我想这对我来说是一个“退路”。如果这是不可能的,或者是不切实际的,那么公平地说,我只是认为这是可能的,因为对于某些人来说,这是一个多么明显的要求!我应该可以使用计时器等,我在商店里也有一些应用程序,所以我对objective-c相当熟悉,只是有点核心数据新手!相信我,我认为这对于几乎所有的核心数据使用来说都是一个明显的要求,我花了大量的时间寻找答案,我确信答案就在那里。看起来很容易。遗憾的是,没有。我考虑的替代实现是重要属性上的KVO,但在考虑了权衡之后——特别是结果代码的脆弱性和对象特定性——我决定反对它。