我有一个带有表视图的导航视图,当单击一行时,行indexPath将传递给下一个视图。
在详细信息视图viewDidLoad中,我从Core Data获取数据。我使用应用程序委托中的提取
[appDelegate loadItem:i];
如你所见,我只传递一个带有行号的整数。
问题是: 如何在另一个线程中进行此调用过程。(在后台) 我需要这个,因为有时候获取的结果太大了,所以处理需要3秒钟来推迟详细信息视图。
我需要显示三秒的活动指示器,所以我需要将Fetch放在另一个线程中,以便在处理提取时能够使用指示器的UI。
我想要最简单的方式,因为我是新手。发布一些代码会很棒。 或链接:)
答案 0 :(得分:15)
混合多线程和核心数据不是一项简单的任务。 Core Data Programming Guide的"Multi-Threading with Core Data"部分描述了如何在多个线程上与Core Data进行交互,包括您需要注意的所有事项。
基本上,您需要为每个线程创建单独的托管对象上下文。这些上下文可以共享对一个托管对象模型和持久性存储的访问。对于您的情况,他们建议如下:
您使用两个托管对象上下文 与单个持久性相关联 商店协调员。你拿一个 在背景上管理对象上下文 线程,并传递的对象ID 将对象提取到另一个线程。在 第二个线程(通常是 应用程序的主线程,以便你 你可以使用,然后显示结果) 对象中的错误的第二个上下文 使用这些对象ID(您使用 objectWithID:实例化 对象)。
听起来像BackgroundFetching示例应用程序显示了如何执行此操作,但我的系统上没有它。
但是,在你对获取请求进行多线程处理之前,我会仔细研究为什么加载这么长时间。我首先建议在NSFetchRequest上使用-setFetchBatchSize:来限制通过fetch加载到内存中的对象数量(这也会为你节省大量内存)。接下来,我将使用-setPropertiesToFetch:将提取的属性限制为仅用于您将立即使用的属性。