美文网首页
[iOS] NSTaggedPointerString 排序问题

[iOS] NSTaggedPointerString 排序问题

作者: 流火绯瞳 | 来源:发表于2018-12-24 11:14 被阅读43次

最近项目中返回地址的分组排序发生错乱的情况,后台返回的城市信息,是放在一个一个大的字典内,使用缩写(例如: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];
            }];

就能正常的进行排序了,如果有知道原因的,还请能够告知,感谢!

相关文章

网友评论

      本文标题:[iOS] NSTaggedPointerString 排序问题

      本文链接:https://www.haomeiwen.com/subject/womakqtx.html