2011-11-14 52 views
0

我有兩個核心數據對象:一個組織和被鏈接在一起的人。核心數據:在不同線程中更改兩個對象時互斥鎖/死鎖?

它是一個問題,如果我在不同的線程改變它們並保存它們兩者兼而有之?所以線程並行運行:

主題1: - 與NSManagedObjectID 加載組織 - 更改對象 - 保存對象

線程2: - 負載人用NSManagedObjectID - 更改對象 - 保存對象

對於我來說,好像我因爲這個互斥;不是每次,但有時會發生。如果這是問題 - 解決方案是什麼? :)

非常感謝!

斯特凡

回答

2

是那是,如果你使用的是相同的NSManagedObjectContext問題。核心數據,並不完全是線程安全的,NSManagedObjectID的。在後臺線程上,您必須使用同一個存儲創建單獨的上下文,然後保存,這會在主線程保存以合併兩個上下文時通知主線程。您可以通過創建合併策略來控制此合併。所以你仍然可以做到,但並不像希望的那麼容易。

+0

我有獨立的NSManagedObjectContexts且只有一個PersistentStore。所以我會認爲它應該工作,不是嗎? – swalkner

+0

你如何合併結果?你有沒有設置通知? – utahwithak

+0

是的,通知已建立。更改與「[mainContext performSelectorOnMainThread:mergeChanges withObject:notification waitUntilDone:YES]」合併;「 – swalkner

0

不要讓線程並行運行。 CoreData非常高效。只需在同一個線程中按順序執行數據操作並保存一次即可。

核心數據的設計是這樣一種方式,很少會出現的必要性,有不止一個NSManagedObjectContext。一個這樣的上下文應該總是在給定的時間在一個線程上運行。

編輯

如果這是不可能的,因爲你是依靠Web服務等,可以考慮使用NSNotification S和做只保存在主線程。 (與performSelectorOnMainThread)。

+0

不幸的是,這並不容易。有在後臺運行異步網絡調用 - 有時我得到一個組織:存儲它。有時我會得到一個客戶 - 商店。 – swalkner

+0

看到我的補充答案。 – Mundi

+0

但我如何獲得NSManagedObject到主線程?如果我在後臺填充對象,我不能將它傳遞給另一個線程,對嗎? – swalkner