我正在尝试使用NSPredicate编写一个过滤器,声明:
IF field_Uid包含 47 ,field_Target包含 202 ...显示这些项目
这部分效果很好。但是,我也希望显示反之亦然的项目,例如:
OR IF fieldUid包含 202 ,fieldTarget包含 47 ...显示这些 项目也
现在,我有以下代码:
NSString *targetedUser = @"47";
NSString *myID = @"202";
NSPredicate *p1 = [NSPredicate predicateWithFormat:@"fieldUid contains[cd] %@", targetedUser];
NSPredicate *p2 = [NSPredicate predicateWithFormat:@"fieldTarget contains[cd] %@", myID];
//E.G. See p3 & p4 being the reverse?
// NSPredicate *p3 = [NSPredicate predicateWithFormat:@"fieldUid contains[cd] %@", myID];
// NSPredicate *p4 = [NSPredicate predicateWithFormat:@"fieldTarget contains[cd] %@", targetedUser];
NSCompoundPredicate *p = [NSCompoundPredicate andPredicateWithSubpredicates:@[p1, p2/*, p3, p4*/]];
NSArray *filtered = [self.messages filteredArrayUsingPredicate:p];
我怎么写后者?我不确定如何在不声明要求所有4行为真的情况下如何做到这一点? (请参阅注释掉的代码 - 我已将其保留,以便您可以看到我的意思......)
答案 0 :(得分:0)
只需将两种化合物"和#34;谓词使用化合物"或"谓词。
你有第一个化合物"和"在你的问题中断言。创建第二个化合物"和"根据需要谓词。
现在使用[NSCompoundPredicate orPredicateWithSubpredicates:]
传递两个"和"复合谓词。
答案 1 :(得分:0)
您也可以使用
NSString *targetedUser = @"47";
NSString *myID = @"202";
//this will easily fix your issue, simply update your query like this
NSPredicate *p = [NSPredicate predicateWithFormat:@"(fieldUid contains[cd] %@ AND fieldTarget contains[cd] %@) OR (fieldUid contains[cd] %@ AND fieldTarget contains[cd] %@)", targetedUser, myID, myID, targetedUser];
NSArray *filtered = [self.messages filteredArrayUsingPredicate:p];