2012-02-16 4 views
3

Я пытаюсь отбирать свой NSMutableArray элементов с фильтромUsingPredicate.NSMutableArray filterUsingPredicate только за определенным индексом

Сложная часть заключается в том, что я всегда хочу содержать не менее 10 элементов в массиве, независимо от того, проходят ли они предикатный тест. Так что-то вроде:

NSPredicate * cullPredicate = [NSPredicate predicateWithFormat: 
     @"distanceFromCurrent <= 25 OR index < 10"]; 

[self.myArray filterUsingPredicate:cullPredicate]; 

The «OR индекс < 10» как признак того, что я хотел бы сделать ... Я понимаю, что это не будет работать.

Возможно ли это с предикатами? Или мне нужно вытащить еще один массив с элементами, начинающимися с 10, применить фильтр, а затем добавить его обратно в исходный массив?

ответ

5

NSPredicate имеет способ -predicateWithBlock:, который вы можете использовать для этого. Что-то вроде этого:

NSArray *array = [[self.myArray copy] autorelease]; 
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {   
    if ([array indexOfObject:evaluatedObject] < 10) return YES; 
    return evaluatedObject.distanceFromCurrent <= 25; 
}]; 
[self.myArray filterUsingPredicate:predicate]; 
+0

Спасибо, он отлично поработал! –

+0

Это должно быть '-filteredArrayUsingPredicate:' not '-filterWithPredicate:' –

+1

@ RichardJ.RossIII Он сказал, что это NSMutableArray, который он пытается фильтровать. '- [NSMutableArray filterUsingPredicate:]' является правильным методом (я скопировал его ошибку, хотя мне показалось, что это не выглядит правильно). Во всяком случае, исправлено через RichardLovejoy, предлагая отредактировать мой ответ. –

Смежные вопросы