【问题标题】:NSFetchedResultsController attempting to insert nil object?NSFetchedResultsController 试图插入零对象?
【发布时间】:2012-11-29 09:17:50
【问题描述】:

很长一段时间以来,我都遇到了一个奇怪的错误,我的大部分表格视图都变黑了(只有少数单元格保持http://cl.ly/LFlS),而在其他视图(连接到同一个 MOC)中,出现了一些其他视觉故障: http://cl.ly/LH3c(注意重复的部分标题)。我一直认为这是 CoreData 的一个错误,但直到今天它被连接到调试器时我才得以重现它。这是我在它发生之前得到的异常:

CoreData:错误:严重的应用程序错误。捕获到异常 在调用期间从 NSFetchedResultsController 的委托 -controllerDidChangeContent:。 * -[__NSArrayM insertObject:atIndex:]: object 不能为 nil with userInfo (null)

在我的controllerDidChangeContent: 方法中,它停在[tableView endUpdates] 行。然后,如果我单击继续,应用程序不会崩溃,但用户交互会变得非常缓慢。我四处寻找可能是导致该异常的原因,但找不到任何东西。有什么线索吗?

我的 NSFetchedResultsController 更改处理看起来很像 Apple 的样板。我的 NSFRC 的 init 如下所示:

NSFetchRequest *request = [[NSFetchRequest alloc] init];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Artist" inManagedObjectContext:[SWDataManager sharedManager].mainObjectContext];
[request setEntity:entity];

[request setFetchBatchSize:100];

NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"sortName" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
[request setSortDescriptors:@[sortByName]];

fetchedResultsController = [[NSFetchedResultsController alloc]
                            initWithFetchRequest:request
                            managedObjectContext:mainObjectContext
                            sectionNameKeyPath:@"firstLetter"
                            cacheName:nil];

fetchedResultsController.delegate = self;
[self refreshDataSource]; // set fetch request predicate and call performFetch on NSFRC
return fetchedResultsController;

编辑:我可以补充一点,这肯定是在我的 MOC 和表格视图中删除了一堆对象之后发生的。

根据要求,我的controllerDidChangeContent: 代码:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView endUpdates];

    // this updates the section index and footer cell and other kind of stuff
    [self performSelector:@selector(layoutSpecialCells) withObject:nil afterDelay:0.3];
}

【问题讨论】:

  • 您需要发布您的-controllerDidChangeContent:
  • @Mundi 添加。就像我说的,没什么特别的……
  • 还添加了出现异常后我的表格视图的截图。
  • 仅供参考,我遇到了同样的问题,this 回答解决了我的问题。就我而言,似乎在将更多单元格添加到表格视图时使用 NSFetchedResultsControllerestimatedRowHeight 会导致未捕获的异常,导致表格视图无响应、滞后且无法正确显示。

标签: iphone ios core-data


【解决方案1】:

我最终向 Apple 申请了 TSI,这是我得到的答案的要点:

为了保护数据存储的完整性,Core Data 捕获了一些 在其操作期间发生的异常。有时这意味着 如果 Core Data 通过委托方法调用你的代码,Core Data 最终可能会捕获您的代码抛出的异常。

在这种情况下,Core Data 通过您的 -controllerDidChangeContent: 方法,由尝试使用 -insertObject:atIndex 将nil 放入 NSMutableArray 引起。

所以基本上该异常是由我的代码引发的,而不一定是由 Core Data 框架引发的。还是找不到异常的根本原因,所以建议:

多线程错误是神秘 Core Data 问题的最常见原因。

走了很长一段路,我意识到我的一些核心数据代码没有封装在performBlock: 调用中。一旦我解决了这个问题,我就再也没有看到这个问题发生了。

【讨论】:

  • 我和你有同样的问题,使用 swift 和 xcode 6.3 和 performBlock 并没有解决我的问题,但删除 estimatedHeightForRowAtIndexPath 似乎有效,但它只是覆盖了没有修复它的错误.. .
【解决方案2】:

为什么在[tableView endUpdates]; 之后更新 UI?为什么要延迟在单独的选择器上执行此操作?

在我看来,这似乎是非常有问题的设计,并且可能是您遇到问题的原因。我强烈建议您在指定的方法中执行由 NSFetchedResultsControllerDelegate 生成的所有 UI 更新。

【讨论】:

  • 同意这是糟糕的设计。但就像我说的那样,该方法根本不会改变 tableView 的内容。该方法很长,所以我不会在这里发布它,但基本上它是:1)在表格视图顶部切换 UILabel; 2) 设置表格视图的页脚单元格; 3) 更改表格视图的 contentInset 和 4) 切换垂直滚动指示器。我会尝试禁用它,但我不确定这些东西是如何造成这个错误的......
  • 可能有误会。 FRC 委托方法响应基础数据的变化,而不是表视图。您应该寻找修改对象图的代码行。
【解决方案3】:

我们可能没有完全相同的问题,但您描述的错误与我的相同。当你看到这个时,我正在使用一些不存在的较新的 API,但我认为我解决了我的问题。如果您好奇,请查看更新 5。 NSFetchedResultsController attempting to insert nil object

【讨论】:

    猜你喜欢
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 2016-08-21
    • 2010-12-23
    • 2023-03-29
    相关资源
    最近更新 更多