Нужен ли подзапрос, чтобы мой nspredicate работал правильно? - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть множество пользовательских объектов, которые имеют кровати (1,2,3), камин (да или нет), логово (да или нет) и высоту потолка (9-11,11-14,14-16),Мне нужно разрешить фильтрацию по любому / всем / ни одному из элементов, выбранных для фильтрации.Таким образом, пользователь может захотеть увидеть 1 & 2 кровати, ден, камин и потолки 9-11 футов.Или только 1 и 2 кровати.Мой текущий предикат работает для некоторых из них.Но это не соответствует всем - только некоторым.Я думаю, что мне нужен подзапрос.Как создать вложенный (?) Подзапрос на основе массива фильтров?

Прямо сейчас пользователь выбирает кнопки, которые сопоставляются с фильтрами, и я использую их для создания предиката.

Текущий предикат

    Filters is an array of keys and predicate strings like 'beds, 1' and 'ceilings, 9-11'

`NSMutableArray *subPredicates = [NSMutableArray array];

    for (Filter*fil in filters) {
        NSPredicate *unitsPredicate = [NSPredicate predicateWithFormat:@"%K == %@", fil.key, fil.predicate];
        [subPredicates addObject:bedsPredicate];
    }

    NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:subPredicates];    
    NSLog(@"homes: %@", [searchArray filteredArrayUsingPredicate:predicate]);
    NSArray *ar = [searchArray filteredArrayUsingPredicate:predicate];

Я бы хотел, чтобы кто-то мог выбрать любой из критериев и вернуть соответствующие данные.

1 Ответ

0 голосов
/ 23 декабря 2018

Подзапросы используются со многими связями.Если вы хотите отфильтровать несколько значений, тогда класс fil.predicate должен быть массивом (или набором) значений.Формат предиката %K IN %@, например

for (Filter*fil in filters) {
    NSPredicate *unitsPredicate;
    if ([fil.predicate isKindOfClass:[NSArray class]])
        unitsPredicate = [NSPredicate predicateWithFormat:@"%K IN %@", fil.key, fil.predicate];
    else
        unitsPredicate = [NSPredicate predicateWithFormat:@"%K == %@", fil.key, fil.predicate];
    [subPredicates addObject:bedsPredicate];
}
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:subPredicates];    

См. Совокупные операции в Руководстве по программированию предикатов .

...