我正在尝试将数据保存到后台线程中的核心数据中,因为它需要相当长的时间来保存。
我做了:
[self performSelectorInBackGround:@selector(insertRecord:) withObject:data];
如果一切正常,直到insertRecord
方法中的一行点击contextsave:&error
。节目收到的信号:"SIGABRT"
我做错了吗?它在主线程中工作正常,我只是将代码移动到另一个方法并在后台运行它并且它不再起作用。
答案 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,并提出了一些在后台保存的策略。基本思想是对属于后台线程的上下文进行更改,然后将更改合并到主线程的上下文中。这为您提供了一个最新的上下文,您可以在后台保存,同时仍然保持主线程的上下文最新。