这里有一个核心数据处理和多线程另一个问题:使用核心数据使用多线程和通知
我在写一篇从网上检索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