Ios NSFetchedResultsController的节数无效
我正在使用NSFetchedResultsController管理我的tableView数据源,但当我尝试添加实体时,它会不断崩溃,导致以下错误:Ios NSFetchedResultsController的节数无效,ios,swift,core-data,nsfetchedresultscontroller,Ios,Swift,Core Data,Nsfetchedresultscontroller,我正在使用NSFetchedResultsController管理我的tableView数据源,但当我尝试添加实体时,它会不断崩溃,导致以下错误: 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:无效的节数。”。更新后表视图中包含的节数(1)必须等于更新前表视图中包含的节数(0),加上或减去插入或删除的节数(0插入,0删除)。“ 执行此代码时发生错误: let exerciseToAdd = Workout_Exercise(
由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:无效的节数。”。更新后表视图中包含的节数(1)必须等于更新前表视图中包含的节数(0),加上或减去插入或删除的节数(0插入,0删除)。“
执行此代码时发生错误:
let exerciseToAdd = Workout_Exercise(context: DataController.shared.context)
exerciseToAdd.name = exercise
exerciseToAdd.exerciseIndex = Int16((currentWorkout?.exercises?.allObjects.count)! + 1)
let firstEmptySet = CDSet(context: DataController.shared.context)
exerciseToAdd.addToSets(firstEmptySet)
currentWorkout.addToExercises(exerciseToAdd)
NSFetchedResultsController是为实体CDSet
设置的,我很确定我有所有必要的协议存根:
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.beginUpdates()
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.endUpdates()
}
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
switch type {
case .insert:
tableView.insertRows(at: [newIndexPath!], with: .fade)
case .delete:
tableView.deleteRows(at: [newIndexPath!], with: .fade)
default:
break
}
}
func numberOfSections(in tableView: UITableView) -> Int {
if let sections = fetchedResultsController.sections?.count {
return sections
} else {
return 0
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let rows = fetchedResultsController.sections?[section].numberOfObjects {
return rows
} else {
return 0
}
}
func controllerWillChangeContent(\ucontroller:NSFetchedResultsController){
tableView.beginUpdate()
}
func controllerDidChangeContent(\控制器:NSFetchedResultsController){
tableView.endUpdates()
}
func控制器(controller:NSFetchedResultsController,didChange anObject:Any,在indexPath:indexPath?处,对于类型:NSFetchedResultsChangeType,newIndexPath:indexPath?){
开关类型{
案例.插入:
tableView.insertRows(位于:[newIndexPath!],带:.fade)
案例.删除:
tableView.deleteRows(位于:[newIndexPath!],带:.fade)
违约:
打破
}
}
func numberOfSections(在tableView:UITableView中)->Int{
如果let sections=fetchedResultsController.sections?.count{
返回段
}否则{
返回0
}
}
func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int{
如果let rows=fetchedResultsController.sections?[section].numberOfObjects{
返回行
}否则{
返回0
}
}
这是我正在使用的获取请求:
let fetchRequest:NSFetchRequest<CDSet> = CDSet.fetchRequest()
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "exercise", ascending: false)]
fetchRequest.predicate = NSPredicate(format: "exercise.workout == %@", currentWorkout)
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: DataController.shared.context, sectionNameKeyPath: "exercise", cacheName: nil)
fetchedResultsController.delegate = self
do {
try fetchedResultsController.performFetch()
} catch {
}
let fetchRequest:NSFetchRequest=CDSet.fetchRequest()
fetchRequest.sortDescriptors=[NSSortDescriptor(键:“练习”,升序:false)]
fetchRequest.predicate=NSPredicate(格式:“exercise.workout==%@”,currentWorkout)
fetchedResultsController=NSFetchedResultsController(fetchRequest:fetchRequest,managedObjectContext:DataController.shared.context,sectionNameKeyPath:“练习”,cacheName:nil)
fetchedResultsController.delegate=self
做{
请尝试fetchedResultsController.performFetch()
}抓住{
}
我不知道是什么原因导致错误发生,是否有人遇到过类似的问题并找到了解决方案?您错过了FRC委托方法之一:
controller:didChangeSection:atIndex:forChangeType:
。有关委托方法,请参见。