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

kra*_*itz 4 iphone core-data objective-c ios4

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

我做了:

[self performSelectorInBackGround:@selector(insertRecord:) withObject:data];
Run Code Online (Sandbox Code Playgroud)

当一切正常时,直到insertRecord方法中的行命中contextsave:&error.节目收到的信号:"SIGABRT"

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

rob*_*off 6

根据" 核心数据编程指南 "中的"核心数据并发"部分:

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

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

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

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

  • 你正在做`[self performSelectorInBackGround:@selector(insertRecord :) withObject:data];`.如果`data`是一个托管对象,那就是你的问题. (2认同)

Cal*_*leb 6

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

博客可可是我的女朋友有一篇文章,核心数据和线程,没有关于这个主题的头痛,并建议一些在后台保存的策略.基本思想是对属于后台线程的上下文进行更改,然后将更改合并到主线程的上下文中.这为您提供了一个最新的上下文,您可以在后台保存,同时仍然保持主线程的上下文最新.

  • 你只是声明一个新指针,但是它指向app delegate的上下文,这无疑是在主线程上创建的.这正是您的问题 - 跨线程共享单个上下文是不安全的.您不能只在后台线程中获得对app delegate上下文的引用; 你必须实际创建一个新的上下文.当然,新的上下文将与主线程的上下文不同,后者存在问题.这就是我上面链接的文章的主题.如果您打算在后台保存,请阅读它. (2认同)