NSCompound Предикатное строительство

Скажем, у меня есть этот массив предикатов в feedDays массив:

<__NSArrayM 0x7ff7f3cd1040>(
    feedDay == 1,
    feedDay == 2,
    feedDay == 4
)

Мне нужно И это с этим statusPredicates массив:

<__NSArrayM 0x7ff7f3cd1070>(
    is_neutered == 0 AND other_status == 0,
    is_neutered == 0 AND other_status == 1,
    is_neutered == 0 AND other_status == 2,
    is_neutered == 0 AND other_status == 3,
)

Как я могу объединить их в один запрос? Я предполагаю, что мне нужно использовать NSCompoundPredicate, но я не могу понять, как получить его и два массива предикатов вместе.

2 ответа

Решение

Мне кажется, что объединенный предикат, такой как

feedDay == 1 && feedDay == 2 ...

всегда будет ложным

Таким образом, вы, вероятно, имеете в виду объединить каждый предикат с neutered условие, чтобы оба условия выполнялись (and) и объединить эти отдельные группы так, чтобы любая из них была истинной (or).

Если вы объедините массив в одно большое соединение с and оно всегда должно быть ложным. Предполагая, что neutered состояние всегда одинаковое,

NSPredicate *finalPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:
  @[[NSPredicate predicateWithFormat:@"is_neutered = 0"],
    [NSCompoundPredicate orPredicateWithSubPredicates:feedDays]]];

Это довольно уродливо, верно? Поэтому я предлагаю вам создать массив с возможными значениями для feedDay и использовать простое

[NSPredicate predicateWithFormat:
     @"is_neutered = 0 && feedDay in %@", allowedFeedDays]

Используйте этот код -

NSMutableArray *allPredicates = [[NSMutableArray alloc] initWithArray:feedDays];
[allPredicates addObjectsFromArray:statusPredicates];

NSCompoundPredicate *finalPred = [NSCompoundPredicate andPredicateWithSubpredicates:allPredicates];
Другие вопросы по тегам