我在FetchedResultsController上遇到CoreData崩溃。
方案::我正在尝试同时在FetchedResultsController上插入和删除一些数据。因此,在此期间,崩溃意外发生。
注意:崩溃很少发生。
我已经尝试了StackOverflow的一些答案,但是没有一个对我有用。因此,找到解决该问题的方法将很有帮助。
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
switch type {
case .insert:
guard let newIndexPath = newIndexPath else { return }
self.tableView.insertRows(at: [newIndexPath], with: rowAnimation)
case .delete:
guard let indexPath = indexPath else { return }
self.tableView.deleteRows(at: [indexPath], with: .none)
case .update:
guard let indexPath = indexPath else { return }
self.updateRow(atIndexpath: indexPath)
case .move:
guard let deleteIndexPath = indexPath, let insertIndexPath = newIndexPath, deleteIndexPath == insertIndexPath else {
return
}
self.updateRow(atIndexpath: insertIndexPath)
}
}
崩溃报告:
***-[AppName.tableView _endCellAnimationsWithContext:],/ BuildRoot / Library / Caches / com.apple.xbs / Sources / UIKitCore / UIKit-3698.119.2 / UITableView.m:1821
中的断言失败[错误]错误:严重的应用程序错误。在调用-controllerDidChangeContent:期间,从NSFetchedResultsController的委托捕获了一个异常。无效的更新:第7节中的行数无效。更新(4)之后,现有节中包含的行数必须等于更新(4)之前,该节中包含的行数。从该部分插入或删除的行数(插入1,删除0),加上或减去移入或移出该部分的行数(移入0,移出0)。与userInfo(空)
我对此问题有一些线索,它发生在tableView.endUpdates()
委托中的controllerDidChangeContent
中。
答案 0 :(得分:0)
在.move
情况下,您什么都不会移动。有一个API:
case .move: tableView.moveRow(at: indexPath!, to: newIndexPath!)
强制展开的路径是安全的,因为控制器在.move
情况下同时发送了两条路径,在其他情况下也发送了适当的路径。
答案 1 :(得分:0)
通过您提供的崩溃消息,好像崩溃是在插入时发生的,但是表视图仍然具有旧的行数。
如Apple文档中所述,建议您执行一系列嵌套在library(data.table)
setDT(df1)
setDT(df2)
df1[df2, on = 'Id', category := 'MC']
df1
# Id category
# 1: 1 MC
# 2: 2 Na
# 3: 3 MC
# 4: 4 Na
# 5: 5 MC
和tableView.beginUpdates()
方法调用之间的表视图更改。
这将允许表视图通过调用
来同步数据tableView.endUpdates()
方法等
因此,您可以做的是在NSFetchedResultsControllerDelegate的方法实现中添加func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
func numberOfSections(in tableView: UITableView) -> Int
调用
tableView.beginUpdates(), tableView.endUpdates()
您还没有正确处理func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.beginUpdates()
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.endUpdates()
}
大小写。 .move
应该改为