2012-02-09 59 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,它將串行訪問持久性存儲。