我有兩個核心數據對象:一個組織和被鏈接在一起的人。核心數據:在不同線程中更改兩個對象時互斥鎖/死鎖?
它是一個問題,如果我在不同的線程改變它們並保存它們兩者兼而有之?所以線程並行運行:
主題1: - 與NSManagedObjectID 加載組織 - 更改對象 - 保存對象
線程2: - 負載人用NSManagedObjectID - 更改對象 - 保存對象
對於我來說,好像我因爲這個互斥;不是每次,但有時會發生。如果這是問題 - 解決方案是什麼? :)
非常感謝!
斯特凡
我有兩個核心數據對象:一個組織和被鏈接在一起的人。核心數據:在不同線程中更改兩個對象時互斥鎖/死鎖?
它是一個問題,如果我在不同的線程改變它們並保存它們兩者兼而有之?所以線程並行運行:
主題1: - 與NSManagedObjectID 加載組織 - 更改對象 - 保存對象
線程2: - 負載人用NSManagedObjectID - 更改對象 - 保存對象
對於我來說,好像我因爲這個互斥;不是每次,但有時會發生。如果這是問題 - 解決方案是什麼? :)
非常感謝!
斯特凡
是那是,如果你使用的是相同的NSManagedObjectContext問題。核心數據,並不完全是線程安全的,NSManagedObjectID的。在後臺線程上,您必須使用同一個存儲創建單獨的上下文,然後保存,這會在主線程保存以合併兩個上下文時通知主線程。您可以通過創建合併策略來控制此合併。所以你仍然可以做到,但並不像希望的那麼容易。
不要讓線程並行運行。 CoreData非常高效。只需在同一個線程中按順序執行數據操作並保存一次即可。
核心數據的設計是這樣一種方式,很少會出現的必要性,有不止一個NSManagedObjectContext
。一個這樣的上下文應該總是在給定的時間在一個線程上運行。
編輯
如果這是不可能的,因爲你是依靠Web服務等,可以考慮使用NSNotification
S和做只保存在主線程。 (與performSelectorOnMainThread
)。
我有獨立的NSManagedObjectContexts且只有一個PersistentStore。所以我會認爲它應該工作,不是嗎? – swalkner
你如何合併結果?你有沒有設置通知? – utahwithak
是的,通知已建立。更改與「[mainContext performSelectorOnMainThread:mergeChanges withObject:notification waitUntilDone:YES]」合併;「 – swalkner