2009-12-29 40 views
10

我正在使用核心數據的iPhone應用程序。該應用程序調用Web服務,解析生成的XML文件,然後在我的應用程序中創建或修改Core Data對象。我已經異步處理Web服務調用和解析,但是我已經將解析的數據移回主線程來操作Core Data對象。我想在後臺線程中運行此過程。 (1-2秒的暫停並沒有爲一個偉大的用戶體驗)NSPersistentStoreCoordinator線程安全嗎?

最明顯的方法是創建一個特定的管理對象上下文後臺線程,但後來我讀到這在Apple's Core Data Programming Guide

持久性商店協調員向其託管對象上下文提供一個虛擬商店的外觀。對於完全併發的操作,每個線程都需要一個不同的協調器。

所以這裏有一個問題:你不能有兩個NSPersistentStoreCoordinator提供訪問同一商店。但是,Marcus Zarra的核心數據手冊斷言NSPersistentStoreCoordinator線程安全並將串行化I/O請求(第157頁)。

有人可以幫我解決這個問題嗎?是否有可能在單獨的線程上運行第二個託管對象上下文,該線程與主線程共享相同的NSPersistentStoreCoordinator?或者,更簡潔地說,是NSPersistentStoreCoordinator線程安全的?

+0

僅供參考您可以讓多個PSC打開同一個存儲文件。 – 2014-02-22 01:29:53

回答

16

Zarra後來指出上下文鎖定了存儲,因此可以跨線程使用相同的NSPersistentStoreCoordinator。

雖然 NSPersistentStoreCoordinator不 線程安全的,這時三 的NSManagedObjectContext知道如何正確 鎖定在使用時。 因此,我們可以將多個 NSManagedObjectContext對象附加到 單個NSPersistentStoreCoordinator中,我們希望不會產生衝突。

2

是否有可能有一個單獨的線程上運行的第二個託管對象上下文與主線程共享相同的NSPersistentStoreCoordinator?

是的!我建議您在開始對CoreData進行多線程訪問之前,仔細閱讀Zarra書中的相應部分。

或者,更簡潔地說,NSPersistentStoreCoordinator是線程安全的嗎?

那麼,'線程安全'這個詞在蘋果文檔中有意義的陰影,所以要非常小心! 看到這個blog article一個很好的解釋。

+0

我剛訂購了Zarra的書,但在此期間,託管環境如何?我可以擁有由多個線程共享的單例上下文嗎? – 2009-12-29 19:10:07

+0

不,您需要每個線程都有一個單獨的上下文,但它們可以鏈接到同一個協調器。如果您直接從他們那裏訂購實用程序員書籍,那麼您可以在紙張發運時立即下載電子書。 – gerry3 2009-12-29 19:12:13