1

我的crashlogs,我发现一个有趣的崩溃,我无法弄清楚它为什么发生。我也无法复制它。NSFetchedResultsController“调用objectAtIndexPath之前无法访问获取的对象”-performFetch:“崩溃时:

它坠毁时,我实现tableView:didSelectRowAtIndexPath:方法内以下行,当用户点击一个单元格:

fetchedResultsController?.objectAtIndexPath(indexPath) as! SearchResultEntity 

崩溃:

Fatal Exception: NSInvalidArgumentException 
cannot access fetched objects before -performFetch: 

的事情是,performFetch:被称为在视图控制器的viewDidLoad方法。因此,performFetch:不可能在tableView:didSelectRowAtIndexPath:调用委托方法之前调用。或者是?

我使用NSFetchedResultController显示数据库结果的相当常见的设置。随着旧记录被删除并插入新记录,数据库中的记录频繁更改。

我想到的一件事是用户可以点击单元格,而其相关对象已从CoreData中删除,并且表格视图正在动画删除更改。那可能吗?

如果这是原因,有什么办法如何避免它?

回答

1

是的,可能发生的情况是,您可能会从fetchedResultsController访问删除对象,但这种情况非常少见。一般而言,NSFetchedResultController's作业将与核心数据同步。但是,当更新进入时,但是在fetchedResultsController有机会更新访问fetchedObject可能导致崩溃的位置之前,可能会有一个很小的时间点。但是它不会导致performFetch未被调用的崩溃。

如果performFetch发生错误,您应该查看日志(或者创建日志,如果没有)。如果用户磁盘空间不足,可能会发生这种情况。您还应该查看fetchedResultsController是否被不同的fetchedResultsController所取代,而执行提取操作的fetchedResultsController未被调用。如果您的viewDidLoad中有任何if语句可能会导致performFetch无法被调用,那么请注意。即使这些陈述预计永远是真实的,但可能会出现这种情况。最后要看的是在您的viewController中设置self.view = nil,这可能会导致viewDidLoad被再次调用,这可能会导致应用程序出现意外行为。

相关问题