iPhone编程 - 使用核心数据保存背景

时间:2011-11-28 04:13:01

标签: iphone objective-c core-data ios4

我正在尝试将数据保存到后台线程中的核心数据中,因为它需要相当长的时间来保存。

我做了:

[self performSelectorInBackGround:@selector(insertRecord:) withObject:data];

如果一切正常,直到insertRecord方法中的一行点击contextsave:&error。节目收到的信号:"SIGABRT"

我做错了吗?它在主线程中工作正常,我只是将代码移动到另一个方法并在后台运行它并且它不再起作用。

2 个答案:

答案 0 :(得分:6)

根据the "Concurrency with Core Data" section of Core Data Programming Guide

  

建议使用Core Data进行并发编程的模式是   线程限制:每个线程必须有自己的完全私有   托管对象上下文。

  

使用线程限制,您不应传递托管对象或   线程之间的托管对象上下文。

看起来您正在将托管对象传递给后台线程,这是禁止的。我不知道你是否也试图在线程之间共享你的托管对象上下文。

该文档描述了将托管对象传递给其他线程的几种解决方法。你需要实现其中一个。

答案 1 :(得分:6)

这里的问题是托管对象上下文不是线程安全的。如果您的-insertRecord:方法使用主线程的托管对象上下文,那么您就会遇到麻烦。

博客Cocoa Is My Girlfriend在这个主题上有一篇文章Core Data and Threads, Without the Headache,并提出了一些在后台保存的策略。基本思想是对属于后台线程的上下文进行更改,然后将更改合并到主线程的上下文中。这为您提供了一个最新的上下文,您可以在后台保存,同时仍然保持主线程的上下文最新。