比较两个NSArray和检测更改的最佳方法是什么

时间:2015-09-19 03:46:44

标签: ios objective-c nsarray nsdictionary nspredicate

我的要求是确定通讯录中的更改(自上次打开申请以来哪些联系人和哪些字段已更改。

现在我有两个NSArrays作为arrSavedContacts(包含以前的地址簿联系人)和arrContacts(当前地址簿联系人)。这就是两个数组的样子

arrSavedContacts

{
    firstName = FirstName Changed;
    id = 224;
    lastName = Udaha;
    phones =         (
                    {
            label = Mobile;
            value = "123456789";
        }
    );
},
    {
    firstName = Chandrananda;
    id = 225;
    lastName = "";
    phones =         (
                    {
            label = Mobile;
            value = "345678912";
        }
    );
},

arrContacts

<meta name="viewport" content="initial-scale=1">

作为上面两个数组,我们可以注意到两个更改,第三个项目被删除,firstName在第一个项目中被更改。

由于我们可以在地址簿中包含数千个项目,我的问题是,比较这两个数组并检测更改的项目(删除,添加,更改内部字段)的最佳和最佳方式是什么?

非常感谢代码示例

1 个答案:

答案 0 :(得分:0)

继续 rmaddy 所建议的,在词典字典中使用数据可以根据唯一ID轻松找到第一个位置的删除。例如,这就是你的基本词典的样子:

{ 224 = {
        firstName = Gayan;
        id = 224;
        lastName = Udaha;
        phones = (
               {
                 label = Mobile;
                 value = "123456789";
               }
                );
        }

    225 = {
        firstName = Chandrananda;
        id = 225;
        lastName = "";
        phones =  (
               {
                 label = Mobile;
                 value = "234567891";
                }
                 );
    }
}

现在,一旦您的数据设置正确,您可以在NSDictionary上添加类别并实施以下方法:

- (NSArray*)changedKeysIn:(NSDictionary*)iAnotherDict {
    NSMutableArray *changedKeys = [NSMutableArray array];

    for (id key in self) {
        if(![[self objectForKey:key] isEqual:[iAnotherDict objectForKey:key]])
            [changedKeys addObject:key];
        }

        return changedKeys;
}

然后简单地称之为:

[baseDict changedKeysIn:anotherDict];