2010-11-28 87 views
0

這裏有一個核心數據處理和多線程另一個問題:使用核心數據使用多線程和通知

我在寫一篇從網上檢索XML數據的iPhone應用程序,分析它在後臺線程(使用的NSXMLParser )並使用其自己的NSManagedObjectContext將數據保存在Core Data中。我有一個課程 - 讓我們稱之爲DataRetriever - 爲我做到這一點。

有不同的UIViewControllers,然後檢索數據以顯示它們各自的UITableViews,當然這發生在主線程使用NSFetchedResultsControllers和一個用於閱讀的管理對象上下文。

我讀過的答案this question,它告訴我,我需要爲在後臺線程NSManagedObjectDidSaveNotifications註冊(這將由DataRetriever類,我想完成),然後調用mergeChangesFromContextDidSaveNotification方法從閱讀上下文主線程上的那個類。我認爲,這完全是線程不安全的。不過,我可能會以錯誤的方式解釋這一點。

我也對主題(修訂在使用通知其他線程)閱讀蘋果文檔的this part,它告訴我,只要註冊爲NSManagedObjectDidSaveNotifications 來閱讀上下文視圖控制器主線程,然後它將不得不調用mergeChangesFromContextDidSaveNotification更新其閱讀上下文。

我跟蘋果的建議:我現在有我的視圖控制器註冊自己的NSManagedObjectDidSaveNotifications在主線程使用讀取管理對象上下文作爲通知的來源。在寫作上下文中這樣做可能不是線程安全的,Apple的文檔在這方面不是很具體。

結果:沒有崩潰,但我也沒有收到任何通知。

注意:我已經閱讀過蘋果的文檔,通知不會自動傳播到其他線程,我甚至可能正在傾聽來自錯誤上下文的通知,但爲什麼Apple告訴我這樣做,然後?

任何幫助,非常感謝。

- 編輯 -

只是要清楚,我註冊了通知,從未來的一個特定的NSManagedObjectContext,蘋果的文件明確規定(here)一些系統架構可以使用核心數據的實例他們自己,所以我可能會收到來自上下文的通知,如果我沒有指定來源,則不會涉及到我。儘管我之前提到的文檔沒有提到這方面的任何內容。歡迎任何關於此設計選擇的意見。

+0

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

回答

1

用戶界面在主線程上運行,因此您需要進行任何可能導致用戶界面在另一個線程上執行的密集處理。主線程中的上下文偵聽通知是因爲主線程上下文通常是唯一需要更新的線程,因爲其他線程中的其他上下文發生更改。

所有這些都是線程安全的,因爲只要一個或多個上下文仍在使用它,數據就不會從持久存儲中刪除。因此,如果上下文A具有包含數據的對象,而上下文B刪除表示相同數據的另一個對象,則上下文A中的對象保持活動狀態,直到上下文A調用合併爲止。

基本上,每個上下文都在其自己的小世界中運行,直到您調用合併爲止。核心數據不會出現通常會降低基於線程的數據操作的競爭條件。

+0

所以,基本上你說的是,我現在這樣做的方式是正確的一?因爲它不工作。我也嘗試將我的視圖控制器(在它們各自的-ViewDidLoad方法中)註冊到來自寫入上下文的通知。但在主線上。這使我的應用程序隨機點崩潰(我想,沒有真正的驚喜,但我不知道該怎麼做)。我可以嘗試在後臺線程上進行註冊,這是一個選項嗎?請清楚我做錯了什麼,以及我在做什麼。 – pancake 2010-11-30 11:02:58