在我的应用程序中,我使用了两个 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/