ios - 比较两个 NSDictionaries 并在键不匹配时删除

标签 ios compare nsdictionary

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

在 basicDictionary 中我有值,比方说

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

key 代表 player 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
}

最佳答案

此代码将为您提供已更改的 key :

注意:由于键的查找基本上是跳入 HashMap (一个 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 -- 已经可以枚举字典了

关于ios - 比较两个 NSDictionaries 并在键不匹配时删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14550777/

相关文章:

split - 比较分割文件的MD5结果与整体的MD5

mysql - 与其他表mysql比较结果

ios - 字典没有名为 'allKeys' 的成员 - swift2 获取所有字典键失败并出现错误

ios - 无法将 NSDictionary 值转换为 json

ios - AudioUnitInitialize 失败,错误代码为 1852008051

ios - 当键盘出现在 ios swift 中时移动 UITableViewCell

python - 根据所选键比较 2 个字典列表,无需 for 循环

iphone - 应用程序在设备上运行和安装的时间太长

ios - Foursquare "Missing access credentials"用于使用客户端 ID 和客户端 key 进行 field 搜索

swift - dictionaryWithObjects : forKeys: in swift 的确切替代品