我有一个后台任务,它获取大量数据,将其保存到核心数据上下文,并将该上下文合并到主线程的上下文中。
我有一个通过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渲染该对象时,可能删除了有问题的对象。如果是这种情况,我该怎么办?我应该吞下这个错误吗?我应该以某种方式检查获取结果控制器的状态吗?
提前致谢。
答案 0 :(得分:0)
您可以删除异常停止并查看是否可以看到真正的异常吗?
隐藏错误看起来像异常系统中的某些内容失败。 “展开”=展开堆栈,这是将执行传递给异常处理程序的一般技术; “sjlc”= setjump / longjump,堆栈展开的C机制; “resume”=因为调试器在中途停止了它?
无论如何,如果后台线程中对象的更改(或删除)是导致问题的原因,也许您可以通过在cellForRowAtIndexPath中锁定持久性存储协调器来解决它。它不应该等待整个后台任务完成。由于您没有明确锁定后台任务(我假设),因此Core Data将采用一些或多或少的智能策略进行锁定,可能会在每次操作时获取和释放锁定。因此,您的UI只需要等待一个操作(可能是一小批操作)。
它可能仍然会伤害到性能,但尝试它并没有什么坏处。即使它使性能无法接受,如果它解决了您的问题,您可能会将其视为确认至少您猜对了原因。