這裏有一個核心數據處理和多線程另一個問題:使用核心數據使用多線程和通知
我在寫一篇從網上檢索XML數據的iPhone應用程序,分析它在後臺線程(使用的NSXMLParser )並使用其自己的NSManagedObjectContext將數據保存在Core Data中。我有一個課程 - 讓我們稱之爲DataRetriever - 爲我做到這一點。
有不同的UIViewControllers,然後檢索數據以顯示它們各自的UITableViews,當然這發生在主線程使用NSFetchedResultsControllers和一個用於閱讀的管理對象上下文。
我讀過的答案this question,它告訴我,我需要爲在後臺線程NSManagedObjectDidSaveNotifications註冊(這將由DataRetriever類,我想完成),然後調用mergeChangesFromContextDidSaveNotification方法從閱讀上下文主線程上的那個類。我認爲,這完全是線程不安全的。不過,我可能會以錯誤的方式解釋這一點。
我也對主題(修訂在使用通知其他線程)閱讀蘋果文檔的this part,它告訴我,只要註冊爲NSManagedObjectDidSaveNotifications 從來閱讀上下文在視圖控制器上主線程,然後它將不得不調用mergeChangesFromContextDidSaveNotification更新其閱讀上下文。
我跟蘋果的建議:我現在有我的視圖控制器註冊自己的NSManagedObjectDidSaveNotifications在主線程使用讀取管理對象上下文作爲通知的來源。在寫作上下文中這樣做可能不是線程安全的,Apple的文檔在這方面不是很具體。
結果:沒有崩潰,但我也沒有收到任何通知。
注意:我已經閱讀過蘋果的文檔,通知不會自動傳播到其他線程,我甚至可能正在傾聽來自錯誤上下文的通知,但爲什麼Apple告訴我這樣做,然後?
任何幫助,非常感謝。
- 編輯 -
只是要清楚,我註冊了通知,從未來的一個特定的NSManagedObjectContext,蘋果的文件明確規定(here)一些系統架構可以使用核心數據的實例他們自己,所以我可能會收到來自上下文的通知,如果我沒有指定來源,則不會涉及到我。儘管我之前提到的文檔沒有提到這方面的任何內容。歡迎任何關於此設計選擇的意見。
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/Concurrency.html – 2017-04-21 22:36:19