我正在开发一个iOS应用程序,我将从服务器获取一个JSON对象,该对象将填充在UITableView上。
用户可以在tableview上更改值,从而生成新的JSON。 现在我想只将delta(两个JSON对象的差异)发送回服务器。 我知道我可以遍历两个对象来寻找delta。但只是想知道这个问题是否有任何简单的解决方案。
例如:
NSDictionary *dict1 = {@"Name" : "John", @"Deptt" : @"IT"};
NSDictionary *dict2 = {@"Name" : "Mary", @"Deptt" : @"IT"};
Delta = {@"Name" : "Mary"}
考虑到新值,Mary为密钥名称;
提前致谢
答案 0 :(得分:4)
isEqualToDictionary:
返回一个布尔值,指示接收字典的内容是否等于另一个给定字典的内容。
if ([NSDictionary1 isEqualToDictionary:NSDictionary2) {
NSLog(@"The two dictionaries are equal.");
}
如果两个词典各自具有相同数量的条目,则两个词典具有相同的内容;对于给定的键,每个词典中的相应值对象满足isEqual:
测试。
答案 1 :(得分:2)
以下是如何获取具有不匹配值的所有键。如何处理这些键是应用程序级别的问题,但是最具信息性的结构将包括来自两个词典的不匹配值的数组,以及处理来自另一个中不存在的键的键:
NSMutableDictionary *result = [@{} mutableCopy];
// notice that this will neglect keys in dict2 which are not in dict1
for (NSString *key in [dict1 allKeys]) {
id value1 = dict1[key];
id value2 = dict2[key];
if (![value1 equals:value2]) {
// since the values might be mismatched because value2 is nil
value2 = (value2)? value2 : [NSNull null];
result[key] = @[value1, value2];
}
}
// for keys in dict2 that we didn't check because they're not in dict1
NSMutableSet *set1 = [NSMutableSet setWithArray:[dict1 allKeys]];
NSMutableSet *set2 = [NSMutableSet setWithArray:[dict2 allKeys]];
for (NSString *key in [set2 minusSet:set1]) {
result[key] = @[[NSNull null], dict2[key]];
}
当然有更经济的方法,但这段代码针对教学进行了优化。
答案 2 :(得分:1)
只需逐个列举并比较字典即可。这样会输出任何差异以及两侧的任何不匹配键,您可以根据要包含的内容来调整逻辑。
- (NSDictionary *)delta:(NSDictionary *)dictionary
{
NSMutableDictionary *result = NSMutableDictionary.dictionary;
// Find objects in self that don't exist or are different in the other dictionary
[self enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
id otherObj = dictionary[key];
if (![obj isEqual:otherObj]) {
result[key] = obj;
}
}];
// Find objects in the other dictionary that don't exist in self
[dictionary enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
id selfObj = self[key];
if (!selfObj) {
result[key] = obj;
}
}];
return result;
}