使用核心数据保存背景?

时间:2010-01-26 15:23:22

标签: performance multithreading core-data

我有一个基于Core Data的iPhone应用程序,需要在终止时保存1000个托管对象。这需要8秒以上,然而,如果操作系统未在大约完成时杀死应用程序。 6秒。

我不想提前保存对象,因为用户必须等待8秒才能显示结果。

是否有可能以某种方式在后台线程中保存对象,同时仍然对主线程中的NSManagedObjectContext进行(只读)访问以显示数据?或者是否可能以某种方式复制托管对象,并将重复项传递给后台线程以进行保存?

为了澄清,现在应用程序中发生了什么:我有一个后台线程,可以在大约1秒内导入1000多个对象。如果我在导入时保存,则需要的时间超过1秒。因此,为了以最小延迟显示那些项目,上下文被切换而不保存到主线程,并且用户尽可能快地获得他的结果。

我现在遇到了如何保存这些对象而无需用户等待8秒的问题。如果我在移交之前保存在后台线程中,则用户必须等待。如果我在移交后保存在前台线程中,则用户必须等待。我现在能看到的唯一两种可能的方法是:

  1. 以某种方式让核心数据在后台进行sqlite访问,同时仍保持主线程被动
  2. 将未保存的对象从一个上下文移交给另一个上下文,并保存在后台线程中
  3. 这两种方法似乎都不可能(至少根据Core Data文档)。那么除了让用户等待更长时间之外没有其他解决方案(并且可能会显示一个漂亮的旋转小时玻璃: - )?

    此致 约亨

1 个答案:

答案 0 :(得分:8)

是的,有一种方法可以从后台线程中保存托管对象上下文,或者更准确地说,它通常被称为“在后台线程中导入,并在主线程中显示”。这样,托管对象在导入时会逐个保存,而不是在终止时一次保存。

我刚刚在SO处就类似问题写了一个简短的答案,但你应该阅读Apple doc。 有很多潜在的陷阱,所以请仔细阅读。然后阅读Apple's "Efficiently Importing Data"。这也是必读的!而Marcus Zarra的CoreData book也很有帮助。

CoreData多线程技术有点棘手,但确实有所回报。祝你好运!