【问题标题】:How to filter using NSPredicate based on if the to many relationship set contains a specific value如何根据多对关系集是否包含特定值使用 NSPredicate 进行过滤
【发布时间】:2016-12-05 14:08:57
【问题描述】:

我有两个实体。一个实体Person,另一个Message。对于每个人,有许多消息(因此存在一对多关系)。我需要用 Persons 填充我的 tableView,但只有具有一组消息的 Persons 至少有一条消息,其属性为sent 等于success

如果我说的不清楚,这里基本上就是我想要的:

(显然这不会编译,为了这个问题我完全弥补了)NSPredicate(Person.messages.contains (sent == "success")

编辑: 忘了提到我正在使用 Core - Data,而不仅仅是一个常规数组。我需要 NSPredicate 来获取结果控制器。

【问题讨论】:

  • 你的谓词中的“朋友”是什么?
  • 让我编辑一下,我的意思是人。对不起
  • NSPredicate(format: "ANY messages.sent == %@", "success") 之类的东西应该可以工作。你看过developer.apple.com/library/content/documentation/Cocoa/…吗?
  • 非常感谢 Martin R!我找不到文档的快速版本。另外,您的答案看起来应该可行!

标签: swift core-data nspredicate


【解决方案1】:

"ANY" 可以与一对多关系一起使用来查找 至少有一个相关对象满足的对象 一个条件。在你的情况下:

 NSPredicate(format: "ANY messages.sent == %@", "success")

【讨论】:

    【解决方案2】:

    你可以像这样在 swift 数组上使用过滤器函数:

    struct Person {
    
        var name: String?
        var meessages = [Message]()
    }
    
    
    struct Message {
    
        var sent: Bool = false
    }
    
    
    let arr: [Person] = [
        Person(name: "person1", meessages: [Message(sent: true), Message(sent: false)]),
        Person(name: "person2", meessages: [Message(sent: false), Message(sent: false)]),
        Person(name: "person2", meessages: [Message(sent: true), Message(sent: true)])
    ]
    
    let filtered = arr.filter({ ($0.meessages.filter({ $0.sent == true })).count > 0 })
    

    【讨论】:

    • ThomasG,非常感谢您的回答,虽然我需要一个 NSPredicate 用于核心数据以用于我的获取结果控制器,但我应该更清楚。
    【解决方案3】:

    那是因为您的 Persons Array 应该是 NSArray , NSPredicates 仅适用于 Foundation 对象而不是 swift types.in Swift 数组 你有过滤器方法,你可以调用它并将它传递给过滤闭包。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-24
      • 2011-02-01
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      相关资源
      最近更新 更多