在后台获取核心数据

时间:2009-11-14 03:23:56

标签: iphone multithreading core-data nsoperationqueue

我有一个带有表视图的导航视图,当单击一行时,行indexPath将传递给下一个视图。

在详细信息视图viewDidLoad中,我从Core Data获取数据。我使用应用程序委托中的提取

[appDelegate loadItem:i];

如你所见,我只传递一个带有行号的整数。

问题是: 如何在另一个线程中进行此调用过程。(在后台) 我需要这个,因为有时候获取的结果太大了,所以处理需要3秒钟来推迟详细信息视图。

我需要显示三秒的活动指示器,所以我需要将Fetch放在另一个线程中,以便在处理提取时能够使用指示器的UI。

我想要最简单的方式,因为我是新手。发布一些代码会很棒。 或链接:)

1 个答案:

答案 0 :(得分:15)

混合多线程和核心数据不是一项简单的任务。 Core Data Programming Guide的"Multi-Threading with Core Data"部分描述了如何在多个线程上与Core Data进行交互,包括您需要注意的所有事项。

基本上,您需要为每个线程创建单独的托管对象上下文。这些上下文可以共享对一个托管对象模型和持久性存储的访问。对于您的情况,他们建议如下:

  

您使用两个托管对象上下文   与单个持久性相关联   商店协调员。你拿一个   在背景上管理对象上下文   线程,并传递的对象ID   将对象提取到另一个线程。在   第二个线程(通常是   应用程序的主线程,以便你   你可以使用,然后显示结果)   对象中的错误的第二个上下文   使用这些对象ID(您使用   objectWithID:实例化   对象)。

听起来像BackgroundFetching示例应用程序显示了如何执行此操作,但我的系统上没有它。

但是,在你对获取请求进行多线程处理之前,我会仔细研究为什么加载这么长时间。我首先建议在NSFetchRequest上使用-setFetchBatchSize:来限制通过fetch加载到内存中的对象数量(这也会为你节省大量内存)。接下来,我将使用-setPropertiesToFetch:将提取的属性限制为仅用于您将立即使用的属性。