Полагаю, под "использованием блоков" вы подразумеваете использование метода NSArray, подобного
- (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate
Тогда это будет выглядеть
NSIndexSet *indexes = [yourArray indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop) {
return (BOOL)([[obj valueForKeyPath:@"category.id"] intValue] == 4);
}];
NSArray *filteredArray = [yourArray objectsAtIndexes:indexes];
Это то, что вы спросили, но я бы предпочел использовать filteredArrayUsingPredicate:
так:
NSPredicate *pred = [NSPredicate predicateWithFormat:@"category.id = %@", [NSNumber numberWithInt:4]];
NSArray *filteredArray = [yourArray filteredArrayUsingPredicate:pred];