2016-12-05 50 views
0

我必须拥有两个实体。一个实体Person,另一个Message。对于每一个人来说,都有很多信息(所以有一对多的关系)。我需要用人员填充我的tableView,但是只有拥有至少一条消息且具有属性sent等于success的消息的人员。如何使用NSPredicate进行筛选,基于多对多关系集是否包含特定值

如果我说的是不明确的,这里基本上是我想:

(显然这不能编译,我完全由它的问题的缘故)NSPredicate(Person.messages.contains (sent == "success")

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

+0

什么是你的谓语中的“朋友”? –

+0

让我编辑,我的意思是人。对不起 – Ryan

+1

像NSPredicate(格式:“任何messages.sent ==%@”,“成功”)应该工作。你看过https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Predicates/AdditionalChapters/Introduction.html吗? –

回答

1

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

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

你可以迅速阵列上使用过滤功能,像这样:

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 }) 
+0

ThomasG,非常感谢你的回答,尽管我需要一个NSPredicate核心数据用于我提取的结果控制器,但我应该更清楚。 – Ryan

0

那是因为你的人阵应的NSArray,NSPredicates仅适用于Foundation对象 你有滤波方法不迅速types.in斯威夫特阵列是您可以调用并通过过滤关闭。

相关问题