在我的崩溃日志中,我发现了一个有趣的崩溃,我不知道为什么会发生。我也不能复制它。
当用户点击一个单元格时,它在我的tableView:didSelectRowAtIndexPath:
方法实现中的以下行中崩溃:
fetchedResultsController?.objectAtIndexPath(indexPath) as! SearchResultEntity
崩溃:
Fatal Exception: NSInvalidArgumentException
cannot access fetched objects before -performFetch:
问题是performFetch:
是在视图控制器的viewDidLoad
方法中调用的。因此,不可能在调用tableView:didSelectRowAtIndexPath:
委托方法之前没有调用performFetch:
。是吗?
我使用的是非常普通的NSFetchedResultController设置,它显示数据库中的结果。数据库中的记录经常被更改,因为旧记录被删除,新记录被插入。
我想到的一件事是,当单元格的相关对象从CoreData中删除时,用户可以点击该单元格,并且表格视图正在动态显示删除更改。这可能吗?
"如果这就是原因,有什么办法可以避免吗"
2条答案
按热度按时间j2datikz1#
是的,您可以从fetchedResultsController访问删除对象,但是在fetchedResultsController有机会进行更新之前,可能会有一个 * 非常 * 小的时间点,在这个时间点访问fetchedObject可能会导致崩溃。但它不会导致
performFetch
未被调用的崩溃。performFetch
失败的错误(如果没有日志,则创建日志)。如果用户的磁盘空间非常低,则可能发生这种情况。fetchedResultsController
是否已被未调用执行获取的不同fetchedResultsController
替换。if
语句。即使这些语句应始终为真,也可能存在不为真的情况。self.view = nil
,这可能会导致再次调用viewDidLoad,这可能会导致应用出现意外行为。vngu2lb82#
我知道这是一个老问题,但我想今天我也遇到了同样的问题:
我有一个UITableviewcontroller,它的UISearchView可以用来搜索实体,这是通过使用NSFetchResultsController在后台线程中查询Core Data来实现的,在每次击键时更新FetchRequest predicate ,并在请求成功后重新加载tableview。
在搜索并单击一个条目后,返回列表并再次快速单击任何条目时,我会得到完全相同的错误。这显然是由于UISearchView在viewDidAppear上触发了对
updateSearchResults(for searchController)
的调用,从而导致NSFetchedResultsController的performFetch
。在提取开始与不可见的(未更改)行,单击它们会导致上述错误。