需求
獲取一批客戶數(shù)據(jù)的時候,需要先調(diào)用接口拿到客戶的基本信息,然后再調(diào)用一個接口來獲取客戶的其他信息,最后合并在一起來使用。
優(yōu)化前
一般情況下數(shù)據(jù)量不大,所以沒有多想,簡單的for循環(huán)了下:
for (CustomerNode *custModel in custInfoColumnArray) {
//結(jié)果集
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條數(shù)據(jù),測了下需要4秒才能處理完,必須進行優(yōu)化了。
優(yōu)化
顯然通過for循環(huán)來查找對象速度太慢,那還有什么好辦法呢?
考慮了一下,使用key-value結(jié)構(gòu)的的hash表查找機制,應該是效率最高的,改造一下:
// 創(chuàng)建一個key-value結(jié)構(gòu)數(shù)據(jù),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方式匹配數(shù)據(jù)效率高到可以忽略,一共只循環(huán)了2次,執(zhí)行時間幾乎變?yōu)榱怂查g,完美!