【问题标题】:How to get unique objects from NSFetchedResultsController?如何从 NSFetchedResultsController 获取唯一对象?
【发布时间】:2018-03-01 13:03:38
【问题描述】:

我有一个实体联系人,它有重复的联系人对象。 例如:

|---------------------|------------------|---------------|
|     Name            |    Index Value   |   Number      |
|---------------------|------------------|---------------|
|  Daniel Higgins     |         4        |    12345      |
|---------------------|------------------|---------------|
|  Daniel Higgins     |         4        |    123456789  |

现在我在这里使用 NSFetchedResultsController 获取联系人并将其用于 UITableviewController。

在这里,我只想显示一个名称 Daniel Higgins 的条目。 如何根据 idexvalue 从 NSFetchedResultsController 中过滤掉唯一对象。

【问题讨论】:

  • 为什么前面有重复,正常吗?但是你可以使用returnsDistinctResults
  • 你的问题解决了吗?

标签: ios swift core-data nsfetchedresultscontroller


【解决方案1】:

您可以像这样创建您的请求(其中ContactResult 是您从核心数据生成的类):

    let request = NSFetchRequest<ContactResult>(entityName: "contacts")
    request.propertiesToFetch = ["name"]    // an array of properties between which should be distinguished
    request.returnsDistinctResults = true   // dont do duplicates

这样就不可能得到像 number 这样的其他属性,否则它们会再次不同,Daniel Higgins 会弹出两次 再次。 如果这确实是您想要的(获取名称和至少一个数字(不在乎哪个)),那么您也可以使用group by

    let request = NSFetchRequest<ContactResult>(entityName: "contacts")
    request.propertiesToGroupBy = ["name"]    // an array of properties between which should be grouped if there are duplicates

警告:如果有多个,选择哪个数字,可能不一致!

但是,您可以按照 Mehul Parmar 的建议直接获取结果:

    context.fetch(request)

或者按照您的建议使用控制器,从而使用它的委托并收到即将发生的更改的通知:

    let controller = NSFetchedResultsController(
        fetchRequest: request,
        managedObjectContext: context,
        sectionNameKeyPath: nil,    // just for demonstration: nil = dont split into section
        cacheName: nil              // and nil = dont cache
    )

【讨论】:

  • @KixxOne 我正在尝试实施您的解决方案,但我仍然从我的FetchReultController 获得重复。你能看看我的问题吗?这是链接:stackoverflow.com/questions/56168119/… 非常感谢
  • 添加这个答案,你必须将你的控制器声明为NSFetchedResultsController&lt;NSDictionary&gt;,检查我在上面评论中的问题以获得完整的指南。
【解决方案2】:

当您创建 fetchResultsController 请求对象时,对其应用谓词以根据您想要的名称过滤掉条目。

然后,当您使用context.fetch(request) 获取对象时,如果有多个条目,您可以简单地使用第一个。

【讨论】:

  • 这里的问题是,他需要知道重复联系人的姓名。我认为我们不能认为这是理所当然的。相反,您可以在fetchedValues 变量上尝试.reduce(),始终检查最后一个结果是否已经包含当前结果。
  • 如果是这种情况,那么是的,首先获取所有条目,然后添加自定义过滤器逻辑以删除重复条目。否则,使用 propertiesToFetch 后跟 returnDistinctResults 作为索引属性。
猜你喜欢
  • 2019-10-20
  • 1970-01-01
  • 2022-06-22
  • 1970-01-01
  • 2010-11-29
  • 2014-11-20
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多