NSFetchedResultsController和数组。插入

时间:2016-04-21 15:02:50

标签: ios swift core-data nsfetchedresultscontroller

我有一个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。但可能存在更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

我不建议将NSFetchedResultsController与表视图以外的任何内容一起使用。它根本不是为其他任何东西设计的。

只需听取NSManagedObjectContextDidSaveNotifications并自行做出反应,您就会 更好。您可以轻松实现自己的上下文监视器(实际上与NSFetchedResultsController具有相同的核心功能),它将为您提供所需的内容,而不是在未设计的情况下尝试与NSFetchedResultsController进行搏斗对

网上有很多例子,我在“实用程序员”的“核心数据”一书中也详细讨论过这个例子:)