使用核心数据保存背景?

Joc*_*hen 9 performance multithreading core-data

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

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

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

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

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

  1. 以某种方式让核心数据在后台进行sqlite访问,同时仍然保持主线程的反应
  2. 将未保存的对象从一个上下文传递到另一个上下文,并保存在后台线程中

这两种方法似乎都不可能(至少根据Core Data文档).那么除了让用户等待更长时间之外没有其他解决方案(并且可能会显示一个漂亮的旋转小时玻璃:-)?

此致,Jochen

Yuj*_*uji 8

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

我刚刚在SO上写了一个关于类似问题的简短回答,但你应该阅读这篇Apple文档.有很多潜在的陷阱,所以请仔细阅读.然后阅读Apple的"有效导入数据".这也是必读的!而Marcus Zarra的CoreData书籍也很有帮助.

CoreData多线程有点棘手,但确实有所回报.祝好运!

  • 同意.在执行导入时保存它们远比在退出时进行大量保存更有效.我还在Mac Developer Network上做了很好的导入演练,甚至还解释了如何进行后台保存. (3认同)