swift2 NSFetchedResultsController““无法在-performFetch:“”之前访问提取得对象调用objectAtIndexPath时崩溃:

hsvhsicv  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(160)

在我的崩溃日志中,我发现了一个有趣的崩溃,我不知道为什么会发生。我也不能复制它。
当用户点击一个单元格时,它在我的tableView:didSelectRowAtIndexPath:方法实现中的以下行中崩溃:

fetchedResultsController?.objectAtIndexPath(indexPath) as! SearchResultEntity

崩溃:

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

问题是performFetch:是在视图控制器的viewDidLoad方法中调用的。因此,不可能在调用tableView:didSelectRowAtIndexPath:委托方法之前没有调用performFetch:。是吗?
我使用的是非常普通的NSFetchedResultController设置,它显示数据库中的结果。数据库中的记录经常被更改,因为旧记录被删除,新记录被插入。
我想到的一件事是,当单元格的相关对象从CoreData中删除时,用户可以点击该单元格,并且表格视图正在动态显示删除更改。这可能吗?
"如果这就是原因,有什么办法可以避免吗"

j2datikz

j2datikz1#

是的,您可以从fetchedResultsController访问删除对象,但是在fetchedResultsController有机会进行更新之前,可能会有一个 * 非常 * 小的时间点,在这个时间点访问fetchedObject可能会导致崩溃。但它不会导致performFetch未被调用的崩溃。

  • 在日志中查找performFetch失败的错误(如果没有日志,则创建日志)。如果用户的磁盘空间非常低,则可能发生这种情况。
  • 检查fetchedResultsController是否已被未调用执行获取的不同fetchedResultsController替换。
  • 请检查viewDidLoad中是否有任何可能导致performFetch未被调用的if语句。即使这些语句应始终为真,也可能存在不为真的情况。
  • 如果您在任何时候在viewController中设置self.view = nil,这可能会导致再次调用viewDidLoad,这可能会导致应用出现意外行为。
vngu2lb8

vngu2lb82#

我知道这是一个老问题,但我想今天我也遇到了同样的问题:
我有一个UITableviewcontroller,它的UISearchView可以用来搜索实体,这是通过使用NSFetchResultsController在后台线程中查询Core Data来实现的,在每次击键时更新FetchRequest predicate ,并在请求成功后重新加载tableview。
在搜索并单击一个条目后,返回列表并再次快速单击任何条目时,我会得到完全相同的错误。这显然是由于UISearchView在viewDidAppear上触发了对updateSearchResults(for searchController)的调用,从而导致NSFetchedResultsController的performFetch。在提取开始与不可见的(未更改)行,单击它们会导致上述错误。

相关问题