比较两个NSDictionaries并删除键不匹配

时间:2013-01-27 18:39:02

标签: ios compare nsdictionary

在我的应用程序中,我使用了两个NSMutableDictionaries。让我们称它们为basicDictionary和refreshDictionary。

在basicDictionary中我有值,让我们说

键:“1”值:“2000”照片:someUIImage //可以说我想跟踪玩家得分 键:“2”值:“1500”照片:someUIImage2 关键:“3”值:“1500”照片:someUIImage3 关键:“4”值:“1500”照片:someUIImage4

键代表玩家ID,休息非常清楚。

我每20秒做一次服务器api调用以刷新玩家的得分。因为我不想使用刷新调用加载照片,只给我带来玩家ID和他的实际分数。

所以每20秒我获得一次保存在refreshDictionary中的数据。该ID只有ID和当前得分。

refreshDictionary示例:

键:“1”值:“2500” 键:“2”值:“2800” 键:“3”值:“2700”

我用新值更新我的tableView。正如你所看到的,我只获得了3名玩家的数据,因为玩家4已经删除了他的个人资料。现在我的问题是,如何更新basicDictionary以删除播放器4?

我知道我应该使用if (!([basicDictionary isEqualToDictionary:refreshDictionary)) 但是,它不会告诉我他们不相等的哪个键。

那你们会做什么?我应该在嵌套循环中迭代它们吗?当字典变大时,这似乎消耗了很多时间。哦顺便说一句,我的词典总是按照同样的方式排序(按玩家ID)

我的想法是,我在

中比较这两个词典
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
        if (refresh)
        { //compare dictionaries and modify basicDictionary that is data source for my tableview by deleting where key doesn't match
}

1 个答案:

答案 0 :(得分:2)

此代码将为您提供更改的密钥:

注意:由于键的查找基本上是跳转到一个hashmap(一个o1 op),你不必担心你谈论的第二个数组步骤

#import <Foundation/Foundation.h>

@interface NSDictionary (changedKeys)
- (NSArray*)changedKeysIn:(NSDictionary*)d;
@end

@implementation NSDictionary (changedKeys)
- (NSArray*)changedKeysIn:(NSDictionary*)d {
    NSMutableArray *changedKs = [NSMutableArray array];
    for(id k in self) {
        if(![[self objectForKey:k] isEqual:[d objectForKey:k]])
            [changedKs addObject:k];
    }
    return changedKs;
}
@end

int main(int argc, char *argv[]) {
    @autoreleasepool {
        NSDictionary *d1 = @{@"1":@"value",@"2":@"value",@"3":@"value",@"4":@"value"};
        NSDictionary *d2 = @{@"1":@"value",@"2":@"newvalue",@"3":@"value"};

        NSArray *ks = [d1 changedKeysIn:d2];
        NSLog(@"%@", ks);   

    }

    return 0;
}

编辑:self.allKeys改为自我 - 已经可以枚举字典