Ios NSFetchedResultsController(核心数据)未提供正确的数据源表视图控制器

Ios NSFetchedResultsController(核心数据)未提供正确的数据源表视图控制器,ios,uitableview,core-data,Ios,Uitableview,Core Data,我最近遇到了一个挑战。我非常感谢任何人能够提供任何支持 问题:NSFetchedResultsController(核心数据)未提供正确的数据源表视图控制器。 我正在努力实现的目标: 我使用CloudKit作为我的主数据库,它存储了大部分用户数据 我使用核心数据在本地存储CKRecordID和recordChangeTag,以更新表视图和集合视图,并将这些存储的值作为句柄来获取相关的CloudKit数据 我创建了一个NSFetchedResultsController作为表视图控制器的实例变量

我最近遇到了一个挑战。我非常感谢任何人能够提供任何支持

问题:NSFetchedResultsController(核心数据)未提供正确的数据源表视图控制器。

我正在努力实现的目标:

  • 我使用CloudKit作为我的主数据库,它存储了大部分用户数据
  • 我使用核心数据在本地存储CKRecordID和recordChangeTag,以更新表视图和集合视图,并将这些存储的值作为句柄来获取相关的CloudKit数据
  • 我创建了一个NSFetchedResultsController作为表视图控制器的实例变量,以获取数据结果作为表视图的数据源
什么有效:

  • CloudKit数据库可以通过应用程序保存、修改和删除CKRecord
  • 如果不使用核心数据NSFetchedResultsController(项目的最后一个版本中只有CloudKit和表视图),应用程序可以加载CloudKit数据,通过CloudKit便捷API将表视图作为数据源提供给它。数据修改和删除也在进行中
我会得到什么错误:

  • 现在我有了CloudKit、Core Data和Table View Controller的实例变量NSFetchedResultsController,当我试图向Core Data数据库添加一个新对象并插入一个新的Table View行时,控制台中显示以下错误,应用程序崩溃:

    • timicip_APITest_CloudKit_TableView_StoringRecordID[37142:1567814]*** 由于未捕获异常而终止应用程序 'NSInternalInconsistencyException',原因:'无效更新:无效 节0中的行数。表中包含的行数 更新(0)后的现有节数必须等于 更新(0)之前该节中包含的行,加号或减号 从该节插入或删除的行数(插入1, 0)并加上或减去移入或移出的行数 该部分(0移入,0移出)。'*
我做了哪些不起作用的事情:

  • 每次向数据库中插入新数据时,我都会调用managedObjectContext.save(),以确保新对象保存到核心数据管理的持久存储中。但是,即使在我这样做之后,我们发现表视图正在尝试从NSFetchedResultsController获取数据,NSFetchedResultsController也不会在表视图数据源方法“tableView(tableView:UITableView,numberOfRowsInSection:Int)->Int”中提供正确数量的已获取对象。应用程序崩溃了。但当我重新打开应用程序时,我在最后打开时输入的数据将显示在表视图中,而当我向表视图添加新对象时,它仍会崩溃
我认为解决方案的方向是什么:

  • 我不确定“managedObjectContext.save()”调用是否真的保存了数据,也不确定使用“NSFetchedResultsController.sections![section].numberOfObjects”是否返回保存的对象
  • 我是否需要通过对结果调用“executeFetchRequest:error:on the NSManagedObjectContext”来从数据库创建新的获取请求,但是如果使用此方法,那么使用专门为表视图设计的NSFetchedResultsController有什么意义呢
  • “insertRowsAtIndexPaths(indexPaths:[nsindepath],withRowAnimation:UITableViewRowAnimation)”是否需要任何支持代码来确保使用正确的indepath更新表视图
摘要:

我想知道如何克服打印错误,以便可以在表视图中添加新行,核心数据数据库从managedObjectContext提供适当数量的对象

解决方案:

实现NSFetchedResultsControllerDelegate,并让它完全控制表视图的CRUD流,而不是调用常规表视图行插入、删除NSFetchedResultsControllerDelegate方法之外的方法,因为核心数据的NSFetchedResultsControllerDelegate充当数据源

非常感谢

问候,

张靖元(靖远骑士章)

解决方案:


实现NSFetchedResultsControllerDelegate,让它完全控制表视图的CRUD流,而不是调用常规表视图行插入、删除NSFetchedResultsControllerDelegate方法之外的方法,因为Core Data的NSFetchedResultsController正在充当数据源。

是否已设置NSFetchedResultsController的委托?如果未设置,FRC将不会监视上下文的更改,因此它将与您所做的更改不同步。感谢您的建议,我尚未实现该委托,我将尝试它。如果我实现它,我应该使用委托更新表视图,还是仍然需要在表视图上手动调用“InsertRowsAtIndexPaths”?我已经实现了nsFetchedResultsControllerDelegate。它可以工作,插入和删除也感觉非常灵敏。谢谢你的建议没问题。作为参考,如果你找到了自己问题的解决方案,你应该将其作为答案添加(回答自己的问题是完全可以接受的)-不要将解决方案放在原始问题中。好的,我会这样做。