CoreData在插入和删除时崩溃同时发生

时间:2019-06-19 14:58:58

标签: ios swift core-data nsfetchedresultscontroller

我在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中。

2 个答案:

答案 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应该改为