核心数据 - 从另一个线程合并上下文的奇怪异常

时间:2011-09-21 13:53:12

标签: objective-c ios core-data

我有一个后台任务,它获取大量数据,将其保存到核心数据上下文,并将该上下文合并到主线程的上下文中。

我有一个通过NSFetchedResultsController列出此数据的tableview。

偶尔(但很少)我在代码的这个区域出现了一个奇怪的错误:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    /* standard uitableview cell stuff */

    PSCourse *course = [_fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = course.name; // <--- EXCEPTION HERE

    return cell;
}

我停在上面提到的那一行(通过obj-c异常断点)。

如果我在调试器中按下继续,我会收到这个难以理解的错误:

  

断言失败:(_ Unwind_SjLj_Resume()无法返回),函数   _Unwind_SjLj_Resume,文件   /SourceCache/libunwind/libunwind-24.1/src/Unwind-sjlj.c,第326行。

我不确定为什么应用程序会在上面的行上崩溃,但是当tableview渲染该对象时,可能删除了有问题的对象。如果是这种情况,我该怎么办?我应该吞下这个错误吗?我应该以某种方式检查获取结果控制器的状态吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以删除异常停止并查看是否可以看到真正的异常吗?

隐藏错误看起来像异常系统中的某些内容失败。 “展开”=展开堆栈,这是将执行传递给异常处理程序的一般技术; “sjlc”= setjump / longjump,堆栈展开的C机制; “resume”=因为调试器在中途停止了它?

无论如何,如果后台线程中对象的更改(或删除)是导致问题的原因,也许您可​​以通过在cellForRowAtIndexPath中锁定持久性存储协调器来解决它。它不应该等待整个后台任务完成。由于您没有明确锁定后台任务(我假设),因此Core Data将采用一些或多或少的智能策略进行锁定,可能会在每次操作时获取和释放锁定。因此,您的UI只需要等待一个操作(可能是一小批操作)。

它可能仍然会伤害到性能,但尝试它并没有什么坏处。即使它使性能无法接受,如果它解决了您的问题,您可能会将其视为确认至少您猜对了原因。