我的崩溃日志,我发现了一个有趣的崩溃,我无法弄清楚它为什么会发生。我都不能复制它。
当我在tableView:didSelectRowAtIndexPath:
方法的实现中的下一行,当用户点击一个单元格时,它崩溃了:
fetchedResultsController?.objectAtIndexPath(indexPath) as! SearchResultEntity
崩溃:
Fatal Exception: NSInvalidArgumentException
cannot access fetched objects before -performFetch:
问题在于performFetch:
在视图控制器的viewDidLoad
方法中被调用。因此,在performFetch:
委托方法被调用之前,tableView:didSelectRowAtIndexPath:
无法调用是不可能的。或者是吗?
我在NSFetchedResultController上使用了非常常见的设置,它显示了数据库的结果。随着旧记录的删除和新记录的插入,数据库中的记录经常被更改。
我想到的一件事是用户可以在从CoreData中删除其相关对象的同时点击单元格,并且表视图为动画删除更改设置动画。这可能吗?
如果这是原因,有什么方法可以避免它吗?
答案 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
。在抓取开始到表视图中的(不变的)行不可见的重新加载之间的短暂时间内,单击它们会导致所提到的错误。