2013-07-24 79 views
0

我正在处理一个非常基本的问题,我有两个字典键我需要比较,但是当我这样做并不给我正确的答案,不知何故我无法创建逻辑。NSDictionary键比较失败

所以我有一个plist数组的字典和json数组来自服务器 我想比较他们如果事件存在于plist做某件事情,如果不做另一件事;

问题:
根据我的逻辑如果在plist中两个事件是等于其它两个事件从服务器正在添加如果逻辑应该每每个字典从服务器来进行打印,所以在这种情况下的总的2倍,但在我的代码中它被打印4次。基本上每次都满足条件。

的NSLog:

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

SOURCE: 在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; 
    } 
) 

CODE:

比较的代码;

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:@“事项标识”]'内循环外面并将其保存在局部变量中。 (我看到你做了这件事,为什么呢?)为什么没有你提取的值的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; 
}