我有一个NSFetchedResultsController的奇怪行为。 我想用它与我的数组(不是tableView)。我的意思是,我的数组应该包含来自NSFetcherResultsController的对象列表。
我创建了我的列表:
_ = try? controller.performFetch()
var myList = controller.fetchedObjects?.map { MyModel($0) }
它有效。但是当我更新NSFetchedResultsController
时我应该更新myList时遇到问题。所以,我有这个方法:
func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
switch type {
case .Insert:
myList.insert(anObject, atIndex: newIndexPath!.row)
case .Delete: ...
我在这条线上崩溃了。例如,如果myList包含40个元素,并且应该插入20个元素,那么newIndexPath
可以等于53,但不是41.我的意思是,插入的顺序不正确(可能是{{1的错误} }})。我的意思是,NSFetchedResultsController
不是插入订单41,42,43,44,45,46等对象,而是插入这样的对象:53,56,42,58,43,46,44等等上。
使用tableView它是有效的,因为当调用NSFetchedResultsController
方法时,didChangeObject
已包含新数据(60个元素)。但我怎样才能得到NSFetchedResultsController
元素的镜像?
目前我只看到一个解决方案。我应该存储更新,以及" controllerDidChangeContent"调用方法,然后我应该通过indexPath对更新进行排序并更新myList。但可能存在更好的解决方案吗?
答案 0 :(得分:0)
我不建议将NSFetchedResultsController
与表视图以外的任何内容一起使用。它根本不是为其他任何东西设计的。
只需听取NSManagedObjectContextDidSaveNotifications
并自行做出反应,您就会 更好。您可以轻松实现自己的上下文监视器(实际上与NSFetchedResultsController
具有相同的核心功能),它将为您提供所需的内容,而不是在未设计的情况下尝试与NSFetchedResultsController
进行搏斗对
网上有很多例子,我在“实用程序员”的“核心数据”一书中也详细讨论过这个例子:)