【发布时间】:2010-11-28 12:14:04
【问题描述】:
这里还有一个关于 Core Data 和多线程的问题:
我正在 iPhone 上编写一个应用程序,它从 Internet 检索 XML 数据,在后台线程中解析它(使用 NSXMLparser),并使用它自己的 NSManagedObjectContext 将数据保存在 Core Data 中。我有一个类 - 我们称之为 DataRetriever - 为我做这件事。
有不同的 UIViewControllers 然后检索数据以将其显示在各自的 UITableViews 中,当然这发生在使用 NSFetchedResultsControllers 和用于读取的单个托管对象上下文的主线程上。
我已经阅读了this question 的答案,它告诉我需要在后台线程上注册 NSManagedObjectDidSaveNotifications(我想这将由 DataRetriever 类完成),然后在读取上下文中调用 mergeChangesFromContextDidSaveNotification 方法从主线程上的那个类。我认为,这完全是线程不安全的。不过,我可能以错误的方式解释了这一点。
我还阅读了 Apple 关于该主题的文档 this part(使用通知跟踪其他线程中的更改),它告诉我只需注册 NSManagedObjectDidSaveNotifications 来自 em> 阅读上下文 in 视图控制器 on 主线程,然后它必须调用 mergeChangesFromContextDidSaveNotification 来更新其阅读上下文。
我接受了 Apple 的建议:我现在让我的视图控制器使用读取托管对象上下文作为通知源在主线程上将自己注册到 NSManagedObjectDidSaveNotifications。在编写上下文中执行此操作可能不是线程安全的,Apple 的文档对此也不是很具体。
结果:没有崩溃,但我也没有收到任何通知。
旁注:我在 Apple 的文档中读到通知不会自动传播到其他线程,而且我什至可能正在侦听来自错误上下文的通知,但是为什么 Apple 告诉我这样做呢?
非常感谢任何帮助。
-- 编辑--
为了清楚起见,我正在注册来自特定 NSManagedObjectContext 的通知,Apple 的文档特别指出 (here) 某些系统框架可能会使用 Core Data 本身的实例,所以如果我不指定来源,我可能会收到来自与我无关的上下文的通知。不过,我之前提到的文档并没有说明这一点。欢迎任何关于此设计选择的 cmets。
【问题讨论】:
标签: multithreading core-data notifications