Obj-C - NSPredicate - 我可以实现'或IF'声明吗?

时间:2017-09-14 17:29:31

标签: ios objective-c nspredicate

我正在尝试使用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行为真的情况下如何做到这一点? (请参阅注释掉的代码 - 我已将其保留,以便您可以看到我的意思......)

2 个答案:

答案 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];