NSFetchedResultsController(Core Data)不提供正确的数据源表视图控制器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NSFetchedResultsController(Core Data)不提供正确的数据源表视图控制器相关的知识,希望对你有一定的参考价值。

我最近遇到了一个挑战。我真的很感激任何人都可以提供任何支持。

问题:NSFetchedResultsController(Core Data)不提供正确的数据源表视图控制器。

我想要实现的目标:

  • 我使用CloudKit作为存储大部分用户数据的主数据库。
  • 我使用Core Data在本地存储CKRecordID和recordChangeTag,以更新Table View和Collection View,并将这些存储值作为获取相关CloudKit数据的句柄。
  • 我创建了一个NSFetchedResultsController作为表视图控制器的实例变量,以获取数据结果作为表视图的数据源。

什么有效:

  • CloudKit数据库可以通过应用程序保存,修改和删除CKRecord。
  • 在不使用Core Data NSFetchedResultsController的情况下,只有CloudKit和Table View位于项目的最后一个版本中,该应用程序可以加载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()来确保将新对象保存到Core Data托管持久存储中。但即使在我这样做之后,我们的表视图也试图从NSFetchedResultsController中获取数据,NSFetchedResultsController将不会在表视图数据源方法“tableView(tableView:UITableView,numberOfRowsInSection”中提供正确数量的其获取对象): Int) - > Int“。应用程序崩溃了。但是当我重新打开应用程序时,我在上次打开时输入的数据将显示在表视图中,而当我向表视图添加新对象时,它仍然会崩溃。

我认为解决方案的方向是什么:

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

摘要:

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

解:

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

非常感谢

问候,

张靖元(Jingyuan Knight Zhang)

答案

解:

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

以上是关于NSFetchedResultsController(Core Data)不提供正确的数据源表视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?