2012-02-09 68 views
1

我一直在使用Core Data和多线程有一段时间的麻烦,我不得不说它让我疯狂。在阅读了一些博客和Apple Docs后,我看到推荐的方法是为每个线程创建一个NSManagedObjectContext(moc),并共享NSPersistentStoreCoordinator。但是,因为我使用NSOperations,并且它们没有附加到特定的线程,所以我必须为每个操作创建一个新的moc。从核心数据和多线程中获取数据时的效率

因此,每次创建moc时,我都将商店协调员设置为模拟,并使用它获取一些数据。然后,如果我需要使用我在另一个线程中获取的对象,例如在前景中,我应该再次获取它们,创建一个新的moc,并使用existingObjectWithID:error:

但据我所知,没有方法接收对象ID数组,因此我必须为每个对象使用该调用(existingObjectWithID:error:),这意味着它可能会循环一段时间,比方说100时间例如。

我的问题是:这是正确的方法吗?我错过了什么吗?它是否比直接从主线程获取数据更快?

我发现的最多信息是关于修改不同线程中的数据,但我几乎找不到关于抓取的信息。

在此先感谢:)

+0

您定位的是哪个版本的iOS? – 2012-02-09 10:54:07

+0

iOS 4和iOS 5(不同的项目) – vicpenap 2012-02-09 11:08:32

+0

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/Concurrency.html – 2017-04-21 22:37:03

回答

1

NSManagedObjectContext对象不是线程安全的。这意味着如果您希望从多个线程访问Core Data,则每个线程都需要一个(并且也在该线程上创建)。其中每一个都可以使用相同的NSPersistentStoreCoordinator,它将串行访问持久性存储。