核心数据 – 在多个线程之间共享NSManagedObjects

我遭受了在多个线程中使用单个MOC的所有后果 – 我的应用随机崩溃,因为MOC是在主线程中创build的,我也用它来填充另一个线程中的数据库。 虽然代码是同步(@synchronize)使用全球单身人士应用程序崩溃。 我读过,每个线程使用一个单独的MOC将使事情正常,但我也看到,这也被认为是一个坏方法跨线程共享NSManagedObjects。

我的用例如下:1)我加载和parsing从服务器的XML和parsing期间,我插入每个新的NSManagedObject在数据库中。 这一切都发生在一个单独的线程。 2)在主线程中,用户与从数据库读取数据的UI进行交互。

在这两个线程我使用NSManagedObjects。 你会如何解决这个问题? 我已经多次失败了。

大多数情况下,应用程序因为错误提示我正在修改集合而枚举它,因为代码是同步的,而当我迭代它时不会发生修改,反之亦然 – 当我修改它时,我不会迭代,保存一次,我完成了。

每个线程使用一个NSManagedObjectContext 。 如果在线程之间进行通信,则传递线程安全的NSManagedObjectID ,然后再从线程上下文中获取对象。 在我的应用程序中,有时甚至每个控制器使用一个上下文

要pipe理不同的上下文,请为NSManagedObjectContextDidChangeNotification注册一个Observer。 在此通知处理中,通过mergeChangesFromContextDidSaveNotification:方法将通知传递给每个上下文。 此方法是线程保存并使上下文更新其状态。

之后,你必须刷新你的观点。 如果你有一个基于表的视图的应用程序,看看NSFetchedResultsController 。 这有助于您使用适当的animation自动更新表格。 如果你不使用表视图,你必须自己实现UI更新。

如果您只支持iOS 5及更高版本,则不需要处理NSManagedObjectID并合并上下文。 您可以使用NSManagedObjectContext的新并发types。 然后在managedObjectContext:performBlock执行操作,它们将自动合并。

使用NSOperationQueues查看来自svena的答案以获取更多信息: 核心数据和并发性