NSFetchedResultsController"在-performFetch之前无法访问获取的对象:"调用objectAtIndexPath时崩溃:

时间:2017-02-10 14:41:02

标签: ios uitableview core-data swift2 nsfetchedresultscontroller

我的崩溃日志,我发现了一个有趣的崩溃,我无法弄清楚它为什么会发生。我都不能复制它。

当我在tableView:didSelectRowAtIndexPath:方法的实现中的下一行,当用户点击一个单元格时,它崩溃了:

fetchedResultsController?.objectAtIndexPath(indexPath) as! SearchResultEntity

崩溃:

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

问题在于performFetch:在视图控制器的viewDidLoad方法中被调用。因此,在performFetch:委托方法被调用之前,tableView:didSelectRowAtIndexPath:无法调用是不可能的。或者是吗?

我在NSFetchedResultController上使用了非常常见的设置,它显示了数据库的结果。随着旧记录的删除和新记录的插入,数据库中的记录经常被更改。

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

如果这是原因,有什么方法可以避免它吗?

2 个答案:

答案 0 :(得分:1)

是的,您可能会从fetchedResultsController访问删除对象,但这种情况非常罕见。通常,NSFetchedResultController's作业与核心数据同步。但是,在更新进入时,但是在fetchedResultsController有机会更新访问fetchedObject可能导致崩溃的情况之前,可能存在非常小的时间点。但它不会导致performFetch未被调用的崩溃。

如果performFetch因错误而失败,您应查看日志(或创建日志,如果没有)。如果用户的磁盘空间非常低,则可能会发生这种情况。您还应该查看fetchedResultsController是否被不同的fetchedResultsController替换,而该if执行了未被调用的提取。如果viewDidLoad中有任何self.view = nil语句可能导致不调用performFetch,也要小心。即使这些陈述始终是真实的,也可能出现这些陈述。最后要看的是在viewController中设置{{1}},这可能导致再次调用viewDidLoad,这可能会导致应用程序出现意外行为。

答案 1 :(得分:0)

我知道这是一个古老的问题,但是今天我也遇到了同样的问题:

我有一个带有UITableviewcontroller的设置,其UISearchView可用于搜索实体。这是通过使用NSFetchResultsController在后台线程中在每次按键上使用更新的FetchRequest谓词查询核心数据并在成功请求后重新加载表视图来实现的。

搜索并单击条目后,返回列表并再次快速单击任何项​​目,我得到完全相同的错误。这是由于以下事实:UISearchView显然触发了对viewDidAppear上的updateSearchResults(for searchController)的调用,从而导致了NSFetchedResultsController的performFetch。在抓取开始到表视图中的(不变的)行不可见的重新加载之间的短暂时间内,单击它们会导致所提到的错误。