2010-08-27 198 views
4

我有一個iPhone應用程序,我正在開發通過網絡傳輸數據,並保存核心數據對象中接收到的數據以備後用。目前。它在單線程中正常工作,但我正在將數據傳輸機制轉換爲在單獨的工作線程中運行。iPhone核心數據和多線程

我讀過關於多線程的核心數據編程指南,我使用每個線程單獨管理對象的背景和一個持久存儲協調規劃,似乎被蘋果推薦。

應用程序的主線程將永遠需要創建或刪除的核心數據對象而會要求工作線程。它主要是閱讀對象並偶爾修改它們。它還會定期要求工作線程從網絡中獲取新對象或更新現有對象。

我的問題涉及我需要做什麼來支持這一點。核心數據編程的多線程部分表示,我可以通過傳遞對象ID在兩個線程之間「傳遞」對象。我有點困惑,至於我需要做什麼。這兩個線程各自擁有自己獲取的每個對象的副本嗎?如果是這樣,他們如何同步?你是否應該明確地斷定你知道另一個線程已修改的對象以使它們重新加載?

比方說,我在主線程中使用對象和工作線程修改它。是否足以讓工作線程通知主線程該對象已被修改,以便主線程可以錯誤地強制重載?還是會自動故障?或者,也許這整個情況是一個壞主意,會導致一個錯誤?

我想通過具有在目前正在使用的所有對象的主線程的字典實現這一點。當工作者線程修改一個,大概是因爲它從網絡獲取了一個更新的版本,我打算讓它指示主線程,如果主線程當前位於它正在使用的對象列表中,則主線程可能會錯誤對象。這聽起來像一個好主意,還是甚至有必要?

+0

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

回答

3

幾個關鍵點要記住:

  1. 只共享對象ID線程之間的
  2. 使用NSManagedObjectContextDidSave通知與的NSManagedObjectContext方法mergeChangesFromContextDidSaveNotification結合:或refreshObject:mergeChanges:
  3. 花一些時間寫作代碼解決合併錯誤(即重置對象並再次嘗試合併等)

您似乎具有正確的基礎知識,通常情況下,它遇到的問題是合併兩個線程中已修改的對象。在這種情況下,您必須重置要合併的對象,將其與通知線程的更改合併,然後根據需要重新應用任何本地更改。有一對夫婦的API方法,可以幫助你在這種情況下:

  1. NSManagedObject#changedValues會給你所有的更改屬性,您可以藏匿在合併後重新申請的字典。遍歷它的鍵並調用NSManagedObject#setValue:forKey:重新應用這些值。
  2. 如前所述,NSManagedObjectContext#refreshObject:mergeChanges :,當知道線程沒有觸及任何相同的屬性時,最好使用此方法。在某些情況下,這是由設計保證的(網絡線程只更新時間戳等)。

最後,在一個封裝的NSOperation你的處理代碼將使它很容易控制你的線程本地管理對象上下文的對象生命週期以及你可能會嚼起來作爲分析的結果,任何記憶。