一次优化,如何使用KVC让查询速度提高n倍

需求

获取一批客户数据的时候,需要先调用接口拿到客户的基本信息,然后再调用一个接口来获取客户的其他信息,最后合并在一起来使用。

优化前

一般情况下数据量不大,所以没有多想,简单的for循环了下:

for (CustomerNode *custModel in custInfoColumnArray) {
    //结果集
    NSMutableArray *resultMutiArray = [resultArray mutableCopy];
    for (NSDictionary *dict in resultMutiArray) {
        NSString *custNum = [dict valueForKey:@"custNum"];
        NSString *unVisitDay = [dict valueForKey:@"unVisitDay"];
        NSString *returnDay = [dict valueForKey:@"returnDay"];
        // 判断custNum一致
        if ([custModel.custNum isEqualToString:custNum]) {
            custModel.unVisitDay = unVisitDay;
            custModel.returnDay = returnDay;
            [resultMutiArray removeObject:dict];
            break;
        }
    }
}

有一天客户反映列表打开巨慢,一查这个resultArray居然至少有5000条数据,测了下需要4秒才能处理完,必须进行优化了。

优化

显然通过for循环来查找对象速度太慢,那还有什么好办法呢?
考虑了一下,使用key-value结构的的hash表查找机制,应该是效率最高的,改造一下:

// 创建一个key-value结构数据,key为需要匹配的cusNum,值为对应的完整对象
NSMutableDictionary *resultDict = [NSMutableDictionary dictionary];
for (NSDictionary *dic in resultArray) {
    [resultDict setValue:dic forKey:[dic valueForKey:@"custNum"]];
}
for (CustomerNode *custModel in custInfoColumnArray) {
    // 直接通过valueForKey匹配到需要修改的对象
    NSDictionary *dict = [resultDict valueForKey:custModel.custNum];
    NSString *unVisitDay = [dict valueForKey:@"unVisitDay"];
    NSString *returnDay = [dict valueForKey:@"returnDay"];
    custModel.unVisitDay = unVisitDay;
    custModel.returnDay = returnDay;
}

不出所料,因为通过KVC方式匹配数据效率高到可以忽略,一共只循环了2次,执行时间几乎变为了瞬间,完美!

你可能感兴趣的:(一次优化,如何使用KVC让查询速度提高n倍)