2014-06-05 4 views
1

У меня есть класс под названием «SMessage»;Фильтровать массив массивов с использованием NSPredicate

@interface SMessage:NSObject 
@property(nonatomic)int messageId; 
@end 

также я могу назвать класс SDay; SDay can имеет много сообщений (SMessage);

И в финале у меня есть общий класс, где у меня есть массив дней;

@interface SCommonClass:NSObject 
@property(nonatomic, strong)NSMutableArray *days; 
@end 

Я пытаюсь фильтровать массив дней и найти сообщение с сообщениемId = 100 (например);

И у меня нет идей, как это сделать, используя NSPredicate; Спасибо за ответы;

+0

Заканчивать http://useyourloaf.com /blog/2010/07/27/filtering-arrays-with-nspredicate.html. Кроме того, люди SO немного похожи на парижан. Они круты, если вы не говорите по-французски, но вам нужно немного попробовать. – danh

ответ

0
NSPredicate *p = [NSPredicate predicateWithBlock:^BOOL(id object, NSDictionary *bindings) { 

    SDay* day = (SDay*)object; 
    NSMutableArray* messages = day.messages; 
    NSPredicate* predicate = [NSPredicate predicateWithFormat:@"messageId == 100"]; 

    if ([messages filteredArrayUsingPredicate:predicate].count == 0) { 
     return NO; 
    } 
    else{ 
     return YES; 
    } 

}]; 


NSArray* result = [common.days filteredArrayUsingPredicate:p]; 

============ обновление ===============

NSPredicate *p = [NSPredicate predicateWithBlock:^BOOL(id object, NSDictionary *bindings) { 

    SDay* day = (SDay*)object; 
    NSMutableArray* messages = day.messages; 
    NSPredicate* predicate = [NSPredicate predicateWithFormat:@"messageID == 100"]; 
    NSArray *filteredMessages = [messages filteredArrayUsingPredicate:predicate]; 
    if (filteredMessages.count == 0) { 
     return NO; 
    } 
    else{ 
     day.messages = [NSMutableArray arrayWithArray:filteredMessages]; 
     return YES; 
    } 

}]; 
+0

Вам нужно настроить предикатный блок. Код должен работать. –

+0

Хм .. Это работает немного неправильно; Когда я пытаюсь фильтровать массив дней, у меня есть следующее: day1 имеет два сообщения (messageId == 100, messageId == 99); и day2 имеет только одно сообщение (messageId == 100); В результате 'NSArray * result = [common.days filterArrayUsingPredicate: p];' Я получил массив с двумя днями, которые имеют те же сообщения, что и до фильтрации; Как мне изменить NSPredicate для получения массива, когда у меня будет два сообщения (messageId == 100) ?; Спасибо; – user3711879

+0

Если вы можете изменить сообщения своих объектов SDay. См. Обновленный ответ. –

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