Подтвердить что ты не робот

Массив фильтра NSPredicate внутри объекта внутри массива

У меня есть следующий метод:

- (NSMutableArray *)getFilteredArrayFromArray:(NSMutableArray *)array withText:(NSString *)text {

if ([array count] <= 0)
    return nil;

NSMutableArray *arrayToFilter = [NSMutableArray arrayWithArray:array];
NSString *nameformatString = [NSString stringWithFormat:@"stationName contains[c] '%@'", text];
NSPredicate *namePredicate = [NSPredicate predicateWithFormat:nameformatString];

NSString *descformatString = [NSString stringWithFormat:@"stationTagline contains[c] '%@'", text];
NSPredicate *descPredicate = [NSPredicate predicateWithFormat:descformatString];

NSString *aToZformatString = [NSString stringWithFormat:@"stationSearchData.browseAtozArray.city contains[c] '%@'", text];
NSPredicate *aToZPredicate = [NSPredicate predicateWithFormat:aToZformatString];

NSPredicate * combinePredicate = [NSCompoundPredicate orPredicateWithSubpredicates:[NSArray arrayWithObjects:namePredicate, descPredicate, aToZPredicate, nil]];

[arrayToFilter filterUsingPredicate:combinePredicate];

return arrayToFilter;
}

Первые два предиката работают нормально. Но последний (aToZPredicate) не работает. stationSearchData - объект StationSearchData, а browseAtozArray - это NSMutableArray.

Как я могу использовать предикат для поиска массива в массиве внутри массива?

Вот интерфейс для объекта StationSearchData:

@interface StationSearchData : NSObject

@property (nonatomic, strong) NSString *location;
@property (nonatomic, strong) NSString *city;
@property (nonatomic, strong) NSString *latitude;
@property (nonatomic, strong) NSString *longitude;

@property (nonatomic, strong) NSMutableArray *browseAtozArray;
@property (nonatomic, strong) NSMutableArray *genreArray;

@end

Спасибо!

4b9b3361

Ответ 1

Прежде всего, вы не должны использовать stringWithFormat для построения предикатов. Это может вызвать если текст поиска содержит специальные символы, такие как ' или ". Поэтому вы должны заменить

NSString *nameformatString = [NSString stringWithFormat:@"stationName contains[c] '%@'", text];
NSPredicate *namePredicate = [NSPredicate predicateWithFormat:nameformatString];

по

NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@"stationName contains[c] %@", text];

Чтобы выполнить поиск внутри массива, вы должны использовать "ЛЮБОЙ" в предикате:

NSPredicate *aToZPredicate =
  [NSPredicate predicateWithFormat:@"ANY stationSearchData.browseAtozArray.city CONTAINS[c] %@", text];