最近项目中返回地址的分组排序发生错乱的情况,后台返回的城市信息,是放在一个一个大的字典内,使用缩写(例如:B)作为 Key,而对应的城市数组为 value 来组织数据的,大概就类似下面这样:
cityList = (
{
B = (
{
citucode = 110;
cityname = "北京市";
}
);
C = (
{
citucode = 220;
cityname = "长春市";
},
{
citucode = 341;
cityname = "池州市";
},
{
citucode = 430;
cityname = "长沙市";
},
{
citucode = 430;
cityname = "常德市";
},
{
citucode = 500;
cityname = "重庆市";
},
{
citucode = 510;
cityname = "成都市";
}
);
}
)
这里就不吐槽这样组织数据的意义了,真的是无力吐槽,还得在前端进行一次排序。
我这里的做法是,取出字典的所有 Keys,然后对Keys 进行排序:
NSArray * cityListArray = [data objectForKey:@"cityList"];
NSDictionary *dic = [cityListArray firstObject];
NSMutableArray *keys = dic.allKeys;
NSArray *sortedKeys = [keys sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
if (obj1 > obj2) {
return NSOrderedDescending;
}else{
return NSOrderedAscending;
}
}];
在之前,一直没有问题,最近则出现顺序不对的情况,看了N多遍没有发现问题,后来想到是不是Keys的类型不对,控制台输出看了下:
(lldb) po [obj1 class]
NSTaggedPointerString
(lldb)
发现,里面的对象是 NSTaggedPointerString 类型的,而不是常用的 NSString 类型,查了下资料,大致知道是为了节省内存,将较小的值和其内存地址放在了一起,该类为 NSString 的子类,详细内容参考iOS Tagged Pointer。
目前不清楚为什么 NSTaggedPointerString 使用 > 进行比较会出错,后来改为如下的方式进行比较:
NSArray *sortedKeys = [keys sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
return [obj1 compare:obj2];
}];
就能正常的进行排序了,如果有知道原因的,还请能够告知,感谢!
网友评论