【问题标题】:NSFetchedResultsController and array. InsertionNSFetchedResultsController 和数组。插入
【发布时间】:2016-04-21 15:02:50
【问题描述】:

我有一个奇怪的 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。我的意思是,插入的顺序不正确(可能是 NSFetchedResultsController 的错误)。我的意思是,NSFetchedResultsController 不是插入顺序为 41、42、43、44、45、46 等的对象,而是插入如下对象:53、56、42、58、43、46、44 等等。 使用 tableView 它正在工作,因为当调用 didChangeObject 方法时,NSFetchedResultsController 已经包含新数据(60 个元素)。但是我怎样才能得到NSFetchedResultsController 元素的镜像呢?

目前我只看到一种解决方案。我应该存储更新,当调用“controllerDidChangeContent”方法时,我应该按 indexPath 对更新进行排序并更新 myList。但可能存在更好的解决方案吗?

【问题讨论】:

  • 使用NSFetchedResultsController没有表格视图有什么好处?主要目的是驱动UI(表格视图)响应NSManagedMangedContext的变化
  • 您是否需要保留myList 的现有内容,或者您​​可以重新创建整个列表?
  • 我使用带有集合结构的自定义视图。关于娱乐列表-我可以,但是如果我有很多元素,那可能需要很长时间
  • 当您可以对更改做出反应并更新列表时,重新创建整个列表是一种浪费。

标签: ios swift core-data nsfetchedresultscontroller


【解决方案1】:

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

要好得多,最好只听NSManagedObjectContextDidSaveNotifications 并自己做出反应。您可以轻松实现自己的上下文观察器(实际上与 NSFetchedResultsController 具有相同的核心功能),它将为您提供您所需要的,而不是在它不是为它设计的情况下试图与 NSFetchedResultsController 搏斗。

网上有很多例子,我也在 The Pragmatic Programmers 提供的关于核心数据的书中详细讨论了它:)

【讨论】:

  • 那么,如果我使用 iCarousel 或一些带有集合结构的自定义视图,我应该创建“自定义”nsfetchedresultscontroller?
  • 在构建自定义 UI 时,在 iOS 上构建自己的 Core Data 观察者是微不足道的,也是预期的行为。我不了解 iCarousel 或任何其他第三方代码,但如果您构建自己的代码,那么监控 Core Data 的变化并对其做出反应是微不足道的。 NSFRC 更像是一个演示,而不是所有 UI 交互的最终答案。
  • 当您有复杂的谓词和排序规则时,这并不是那么简单。如果它是如此微不足道,为什么人们不使用 3rd 方获取的控制器? :) 如果你喜欢重复的代码,我不喜欢。 Nsfetchedresultscontroller 具有出色的缓存和排序功能。如果你有很棒的 fetched 控制器,请给我 :)
猜你喜欢
  • 2011-07-01
  • 2013-02-10
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多