1

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

在 basicDictionary 我有价值观,让我们说

key:"1" value:"2000" photo:someUIImage //假设我想跟踪玩家的得分 key:"2" value:"1500" photo:someUIImage2 key:"3" value:"1500" photo:someUIImage3键:“4” 值:“1500” 照片:someUIImage4

key 代表玩家 id,rest 很清楚。

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

所以每 20 秒我就会得到保存在 refreshDictionary 中的数据。只有 id 和该 id 的当前分数。

刷新字典示例:

键:“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
}
4

1 回答 1

2

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

注意:由于键的查找基本上是跳转到哈希图(o1 操作)中,因此您不必担心您所说的第二个数组遍历

#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 更改为 self - 已经可以枚举字典

于 2013-01-27T18:59:01.140 回答