2009-11-14 104 views
3

我有一个带有表视图的导航视图,当单击一行时,行indexPath传递给下一个视图。在后台获取核心数据

在详细信息视图viewDidLoad,我从核心数据中提取数据。我用的是取从应用程序委托

[appDelegate loadItem:i];

正如你能看到我的传球只有一个整数,它携带的行号。

的问题是: 我怎么能够做这样的过程在另一个线程(在后台) 我需要这个,因为有时候的结果取太大,所以处理需要3秒延迟推详细视图。

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

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

+0

通常,您将拥有一个与用户可以在表视图中选择的行对应的获取对象数组。 在这种情况下,您已经获取了想要使用Details视图的对象。你可以添加一些细节,为什么这不起作用? – gerry3 2009-11-14 03:45:21

回答

15

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

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

您使用两个管理对象上下文有一个持久 店协调相关 。您可以在后台 线程中获取一个 受管对象上下文,并将获取对象的对象ID传递给另一个线程。在 第二螺纹(通常是 应用程序的主线程,这样就 可以然后显示结果),可以使用 第二上下文,以与这些对象ID的对象 故障(使用 objectWithID:实例化 对象)。

听起来像BackgroundFetching示例应用程序显示如何做到这一点,但我没有在我的系统上。

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

+0

谢谢..这是很大的帮助..阅读更多关于此.. Adham – Adhamox 2009-11-14 22:58:47