我最近遇到了一个挑战。我真的很感激任何人都可以提供任何支持。
问题: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将表视图作为其数据源提供。数据修改和删除也有效。
我得到什么错误:
我做了什么不起作用:
- 每当我将新数据插入数据库时,我都会尝试通过调用managedObjectContext.save()来确保将新对象保存到Core Data托管持久存储中。但即使在我这样做之后,我们的表视图也试图从NSFetchedResultsController中获取数据,NSFetchedResultsController将不会在表视图数据源方法“tableView(tableView:UITableView,numberOfRowsInSection”中提供正确数量的其获取对象): Int) - > Int“。应用程序崩溃了。但是当我重新打开应用程序时,我在上次打开时输入的数据将显示在表视图中,而当我向表视图添加新对象时,它仍然会崩溃。
我认为解决方案的方向是什么:
- 我不确定“managedObjectContext.save()”调用是否真的保存了数据,也不确定是否使用“NSFetchedResultsController.sections![section] .numberOfObjects”返回保存的对象。
- 我是否需要通过对结果调用“executeFetchRequest:error:on NSManagedObjectContext”来从数据库创建新的获取请求,但是如果使用此方法,那么为表格视图专门设计的NSFetchedResultsController有什么意义呢?
- “insertRowsAtIndexPaths(indexPaths:[NSIndexPath],withRowAnimation animation:UITableViewRowAnimation)”是否需要任何支持代码以确保使用更正的indexPath更新表视图?
要点:
我想知道如何克服打印错误,以便我可以在表视图中添加一个新行,其中Core Data数据库从managedObjectContext中提供适量的对象。
解决方案:
实现NSFetchedResultsControllerDelegate,让它完全控制表视图的CRUD流,而不是调用常规表视图行插入,删除NSFetchedResultsControllerDelegate'方法之外的方法,因为Core Data的NSFetchedResultsController充当数据源。
非常感谢
此致
张靖元(Jingyuan Knight Zhang)