Написание NSP предиката - PullRequest
       6

Написание NSP предиката

1 голос
/ 08 февраля 2012

У меня есть несколько проблем, связанных с NSPredicates, вот они;

1.) Мой код выглядит следующим образом:

 NSArray *arr= [self.humanArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"ANY name IN %@ ", nameArray]];

Я получаю следующее исключение;

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The left hand side for an ALL or ANY operator must be either an NSArray or an NSSet.'

*** Call stack at first throw:

Когда я пишу предикат как @"name IN %@ ", nameArray.Это работает, но я думаю, что в этом может быть какой-то недостаток.

примечание: humanArray, содержит объекты HUMAN, а объект human содержит следующие атрибуты.name, age, gender, country, region.

2.) Я думаю, что я здесь делаю, неправильно.Пользователю предоставляется возможность фильтрации self.humanArray.Пользователь может фильтровать, используя один, несколько или ни один из следующих критериев:

name, age, gender, country or region.

Мой код выглядит следующим образом;

 NSArray *fRegionArray= [self.humanArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"regionIN %@ ", regionArray]];



 NSArray *fCountryArray= [fRegionArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"country IN %@ ", countryArray]];



 NSArray *fNameArray= [fCountryArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"name IN %@ ", nameArray]];

Этот код работает, если пользователь выбирает все фильтрыатрибуты (region, country и name).Если вы посмотрите на приведенный выше код, то заметите, что выходной массив 1-го предиката используется для фильтрации во 2-м предикате.Вот почему он так себя ведет.

Мне нужно изменить приведенный выше код, чтобы пользователь мог ввести любой из атрибутов для целей фильтрации.region или country или name.

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Я сделал это в моем проекте, где мне нужно было отфильтровать массив объектов на основе нескольких критериев.

NSPredicate *filterBlock = [NSPredicate predicateWithBlock: ^BOOL(id obj, NSDictionary *criteria){

        NSString *name = [criteria objectForKey:@"name"];
        NSString *gender =....................

        YourObject *yo = (YourObject*)obj;
        if (yo.name isEqualToString:name && yo.gender isEqualToString:gender) {
            // refine all your criteria
            return YES;
        } else {
            return NO;
        }
}];


NSArray *result = [arrayToBeFiltered filteredArrayUsingPredicate:filterBlock];

Это сработало, и это не так уж плохо в отношении скорости.

1 голос
/ 08 февраля 2012
  1. foo IN уже означает любой объект foo в указанном массиве.Вы бы использовали ЛЮБОЙ, а затем базовое выражение (например, ЛЮБЫЕ objects.value <13).IN является агрегатным выражением. </li>
  2. Вы можете использовать временное значение и фильтровать его только по фактически используемым атрибутам?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...