2013-07-24 4 views
0

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

Итак, у меня есть это в массиве словаря и json-массива, начиная с сервера Я хочу сравнить их, если событие существует в plist, делает определенную вещь, если не делает другую вещь;

ПРОБЛЕМА:
Согласно моей логике, если два события в PLIST равно двум событий пришедших с сервера, если логика должна быть напечатана на каждый словарь наступающего от сервера, поэтому в данном случае 2 раза общего, но в моем коде он печатается 4 раза. в основном он удовлетворяет условию каждый раз.

NSLog:

evreka find the id 
evreka find the id 
evreka find the id 
evreka find the id 

ИСТОЧНИК: в PLIST;

createList (
     { 
     "end_date" = "2013-07-24"; 
     ends = "13:07:00"; 
     "event_id" = 173; 
     "event_name" = Static; 
     location = Asdad; 
     "root_folder" = "[email protected]"; 
     "start_date" = "2013-07-24"; 
     starts = "13:07:00"; 
     "user_id" = 13; 
    }, 
     { 
     "end_date" = "2013-07-25"; 
     ends = "13:08:00"; 
     "event_id" = 174; 
     "event_name" = "Event Delete"; 
     location = Asdsad; 
     "root_folder" = "[email protected]"; 
     "start_date" = "2013-07-25"; 
     starts = "13:08:00"; 
     "user_id" = 13; 
    } 
) 

Это пришедшего от сервера

responseobj (
     { 
     "end_date" = "2013-07-24"; 
     ends = "13:07:00"; 
     "event_id" = 173; 
     "event_name" = Static; 
     location = Asdad; 
     "root_folder" = "[email protected]"; 
     "start_date" = "2013-07-24"; 
     starts = "13:07:00"; 
     "user_id" = 13; 
    }, 
     { 
     "end_date" = "2013-07-25"; 
     ends = "13:08:00"; 
     "event_id" = 174; 
     "event_name" = "Event Delete"; 
     location = Asdsad; 
     "root_folder" = "[email protected]"; 
     "start_date" = "2013-07-25"; 
     starts = "13:08:00"; 
     "user_id" = 13; 
    } 
) 

КОД:

Сравнение кода;

if ([[NSFileManager defaultManager] fileExistsAtPath:dataPath]){ 
     createList= [NSMutableArray arrayWithContentsOfFile:dataPath]; 
     NSLog(@"createList %@",createList); 
     NSLog(@"responseobj %@",responseObj); 


     //compare plist and response object 
     for (int i=0; i<[responseObj count]; i++) { 
      NSDictionary *dataDict = [responseObj objectAtIndex:i]; 

      NSString *event_name =[dataDict objectForKey:@"event_name"]; 
      //NSString *event_id =[dataDict objectForKey:@"event_id"]; 

      BOOL eventExistInPlist=NO; 


      for (int j=0; j<[createList count]; j++) { 
       NSDictionary *createDict = [createList objectAtIndex:i]; 

       //NSString *create_id =[createDict objectForKey:@"event_id"]; 
       NSNumber *create_id =[createDict objectForKey:@"event_id"]; 

       if ([[dataDict objectForKey:@"event_id"] isEqual:[createDict objectForKey:@"event_id"]]) { 
       // if (create_id==event_id) { 
        NSLog(@"evreka find the id"); 

То, что я пробовал: Я попытался сравнить их как строки (isEqualtoString), числа (==) и IsEqual: метод, все они потерпели неудачу.

Что я делаю неправильно?

+0

Во-первых, сделать вещи проще и менее запутанной путем извлечения значения '[dataDict objectForKey: @«event_id»]' вне внутреннего цикла и удерживая его в локальной переменной. (Я вижу, что вы сделали это и прокомментировали это. Почему?) И почему нет NSLogs значений, которые вы получаете - они, вероятно, быстро идентифицируют вашу проблему? –

ответ

3

В

NSDictionary *createDict = [createList objectAtIndex:i]; 
                 ^----- HERE 

вы используете неправильный индекс, он должен быть j вместо i для внутреннего контура.

+0

OMG !, Спасибо –

+0

@MordFustang: Добро пожаловать! –

1

Ответ Мартина R - вот где ваша проблема. Я бы изменил вашу логику, но включил быструю перечисление Objective-C вместо стандартного цикла for ++. Я также отделен второй для цикла в метод BOOL для удобства чтения

for (NSDictionary *dataDict in responseObj) { 
    NSString *event_name =[dataDict objectForKey:@"event_name"]; 
    if ([self matchFoundForEventId:event_name]) { 
     NSLog(@"Match found"); 
    } 
} 

-(BOOL)matchFoundForEventId:(NSString *)eventId { 
    for (NSDictionary *dataDict in createList) { 
     NSString *createEvent = [dataDict objectForKey:@"event_id"]; 
     if ([eventId isEqualToString:createEvent]) { 
      return YES; 
     } 
    } 
    return NO; 
} 
Смежные вопросы