NSPredicate不会返回预期的项目

时间:2018-02-02 23:36:59

标签: ios objective-c nspredicate

我正在尝试在数组中找到itemIdsize不匹配的项目。 但是,以下查询不会返回itemId相同但size不同的项目。我想知道我错过了什么。

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

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 个答案:

答案 0 :(得分:1)

我认为这里有两个问题:

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

  2. 我认为你想使用or谓词。正如您现在所拥有的那样,您将错过任何具有相同尺寸或​​相同itemId的内容。

  3. 另一种方法可能是使用获取所有对象的获取。然后使用现有的fetch获取您想要的原始集。然后使用Set Arithmetic从第一组中删除第二组。

    **编辑**

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