2010-11-28 84 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