NSPredicate 没有 return 预期的项目

NSPredicate does not return the expected items

我试图在数组中查找 itemIdsize 不匹配的项目。 但是,以下查询不会 return me item(s) where itemId same but size different.我想知道我错过了什么。

首先我按如下方式提取该项目,然后我试图找到对该项目的赞美。

NSPredicate *itemPredicate = [NSPredicate predicateWithFormat:@"(%K == %@)", kItemId, itemId];
NSPredicate *sizePredicate = [NSPredicate predicateWithFormat:@"(%K == %@)", kSize, [NSString stringWithFormat:@"%d", size]];
NSPredicate *combinedPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[itemPredicate, sizePredicate]];
NSArray *itemInOrder = [sharedData.orderItems filteredArrayUsingPredicate:combinedPredicate];

正在尝试提取 免费itemInOrder

NSPredicate *restOfOrderPredicate = [NSPredicate predicateWithFormat:@"(%K != %@)", kItemId, itemId];
NSPredicate *restSizePredicate = [NSPredicate predicateWithFormat:@"(%K != %@)", kSize, [NSString stringWithFormat:@"%d", size]];
NSPredicate *restCombinedPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[restSizePredicate, sizePredicate]];
NSMutableArray *restOfItemsInOrder = [NSMutableArray arrayWithArray:[sharedData.orderItems filteredArrayUsingPredicate:restOfOrderPredicate]];

我认为这里有两个问题:

  1. 您的补充 and 谓词正在使用 sizePredicate,但我认为您想使用 restSizePredicate.

  2. 我认为您想使用 or 谓词。正如你现在拥有的那样,你会错过任何大小相同或 itemId.

  3. 的东西

另一种方法是使用获取所有对象的提取。然后使用您现有的提取来获取您想要的原始集。然后使用 Set Arithmetic 从第一个集合中删除第二个集合。

** 编辑 **

  1. 我刚刚发现 notPredicateWithSubpredicate 这可能正是您想要的:保持第一个查询和谓词不变。然后对于第二个查询,使用 notPredicateWithSubpredicate 并传入第一个查询的谓词。