3

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

在 Details 视图 viewDidLoad 中,我从 Core Data 获取数据。我使用来自应用程序委托的获取

[appDelegate loadItem:i];

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

问题是:我怎样才能在另一个线程中进行这个调用过程。(在后台)我需要这个,因为有时获取的结果太大,所以处理需要 3 秒延迟推送详细信息视图。

我需要在三秒钟内显示一个活动指示器,因此我需要将 Fetch 放在另一个线程中,以便能够在处理 fetch 时将 UI 用于指示器。

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

4

1 回答 1

15

混合多线程和 Core Data 并不是一项简单的任务。Core Data Programming Guide的“Multi-Threading with Core Data”部分描述了如何在多个线程上与 Core Data 交互,包括所有你需要注意的事情。

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

您使用与单个持久存储协调器关联的两个托管对象上下文。您在后台线程上获取一个托管对象上下文,并将获取的对象的对象 ID 传递给另一个线程。在第二个线程(通常是应用程序的主线程,以便您随后可以显示结果)中,您使用第二个上下文在具有这些对象 ID 的对象中出错(您使用 objectWithID: 来实例化对象)。

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

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

于 2009-11-14T04:43:16.217 回答