6

我们每隔一段时间就会收到“CoreData 无法完成错误”。我们已通读 Apple 文档,但不清楚允许保留哪些内容。我们一直非常小心地为每个线程创建一个上下文,等等。但是,我们的应用程序正在做的一件事是我们在 UIViewControllers 上保留 NSManagedObjects(通常通过 NSArray 或 NSDictionary)。我猜发生了什么是对象关系正在改变,我们没有处理适当的通知。

有人对 Core Data 的更好设计有什么建议吗?当我们收到错误时,我看不到我们实际上从上下文中删除了任何内容来导致错误。如果它们保持状态,是否有必要在我们的 UIViewControllers 上处理 NSManagedObjectContextObjectsDidChangeNotification?任何建议,将不胜感激。

4

1 回答 1

5

您可以在 Core Data 中注册更改通知。这将允许您在托管对象更改时更新它们。有关更多信息,请参阅核心数据文档。您将对注册和响应更改的 2 种方法感兴趣:

  [NSNotificationCenter defaultCenter] addObserver:self
                                          selector:@selector(mergeChanges:)
                                              name:NSManagedObjectContextDidSaveNotification
                                            object:(your NSManagedObjectContext)];

mergeChanges 选择器(您的方法)将调用以下方法来同步来自其他线程的任何更改。它看起来像这样:

- (void)mergeChanges:(NSNotification *)notification{
  AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
  NSManagedObjectContext *context = [appDelegate managedObjectContext];

  // Merge changes into the default context on the main thread
  [context performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
                            withObject:notification
                         waitUntilDone:YES];  
}
于 2011-08-10T14:30:39.517 回答