Нспредикат выпуск - PullRequest
       3

Нспредикат выпуск

1 голос
/ 02 января 2012

У меня есть такие данные, разделенные запятой (образец dict ниже)

NSMutableArray *sessions = [[NSMutableArray alloc] init];    
demodata * sess = [[demodata alloc] init];  --->nsobject    
sess.Day=@"Monday";    
sess.content=@"HI";    
sess.id=@"1,2,3";    
[sessions addObject :sess];
[sess release];   

demodata * sess1 = [[demodata alloc] init];  
    
sess1.Day=@"Tuesday";    
sess1.content=@"Bye";    
sess.id=@"1,5";  
[sessions addObject :sess1];          
[sess1 release];  

Я хочу отобразить данные идентификатора, имеющие только 1 (зависит от динамического);

Например: в моем табличном представлении есть список событий, каждое событие имеет один идентификатор. например, если я выбираю id = 1, я хочу отобразить два объекта (1 с 1-м и 2-м объектом), упомянутых выше. Если я выбираю id = 5, я хочу отобразить только вторые объекты (5 с 2-м объектом только), упомянутых выше.

. (Я попытался nspredicate и прочитал каждый индекс, разделенный запятой). Есть ли простой способ фильтрации

Ответы [ 3 ]

0 голосов
/ 02 января 2012

Поскольку вы предоставили только очень расплывчатую информацию о требованиях, я покажу очень общий подход, который я использую с блоками:

записать категорию в массив:

-(NSArray *)filter:(BOOL (^)(id))filterBlock
{
    NSMutableArray *filteredArray = [NSMutableArray array]; 
    for (id element in self) 
        if (filterBlock(element))   
            [filteredArray addObject:element]; 
    return [NSArray arrayWithArray:filteredArray]; 
}

Теперь у вас есть свобода создавать конкретный блок, соответствующий вашим потребностям:

array = [array filter:^BOOL(id element) {
    DemoData *demoData =(DemoData *)element
    if([[demoData.sessionID componentsSeparatedByString:@","] isEqualToString:@"1"]){
        return YES
    }
    return NO;
}];

Это отфильтровывает все сессионные идентификаторы, начинающиеся с '1'.

ответ на редактирование
Вы должны сделать это наоборот. У вас должен быть NSDictionray, который использует NSNumber в качестве ключей и содержит NSArrays с объектами. Чем вы можете просто спросить NSArray *array = [dict objectForKey:[NSNumber numberWithInt:5]]. Теперь массив содержит все объекты, связанные с идентификатором (который вы действительно должны назвать по-другому).

0 голосов
/ 02 января 2012

Если вы хотите динамический, используйте predicateWithBlock. Если вы хотите отфильтровать коллекцию demodata объектов, в которых id содержится 1 , тогда ваш NSPredicate должен выглядеть следующим образом:

NSPredicate *filterWhereIdContains1 = [NSPredicate predicateWithBlock: ^BOOL(id evaluatedObject, NSDictionary *bindings){
           demodata *sess = (demodata*)evaluatedObject;
           NSArray *splitIds = [sess.id componentsSeparatedByString:@","];
           return [splitIds containsObject:@"1"];
}];
0 голосов
/ 02 января 2012

id - зарезервированное слово Objective C для указателя на объект неизвестного типа. Я бы посоветовал не использовать его как свойство пользовательского класса. Даже если это технически работает, чего не может быть, это сбивает с толку.

Я все еще не уверен, что вы хотите, но приведение к NSString * может помочь.

((NSString*) ((demodata*)[sessions objectAtIndex:0]).id) //do something with this NSString*

Вместо того, чтобы пытаться проанализировать NSString для запятых, возможно, сделайте свойство NSSArray *, в котором каждое число хранится в виде отдельного индекса (сначала оберните их в экземпляр NSNumber).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...