在我的应用程序中,我使用了两个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
}
答案 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改为自我 - 已经可以枚举字典