目标 C:NSDictionary 无序

Posted

技术标签:

【中文标题】目标 C:NSDictionary 无序【英文标题】:Objective C: NSDictionnary Unordered 【发布时间】:2019-02-18 07:32:08 【问题描述】:

我从 API 收到一个 json 格式对象的数组,所以我把它放在一个 NSDictionnary 中,问题是它与接收到的声音的顺序不同。如何恢复秩序?我尝试了下面的代码行:

- (void)connectionManagerDidGotPriceList:(NSDictionary *)prices
NSArray *sortedKeys = [prices.allKeys sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES]]];

NSArray *sortedValues = [prices objectsForKeys:sortedKeys notFoundMarker:@""];

list_categories = sortedKeys;
list = sortedValues;
[priceList reloadData];

但我得到了这个错误

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSArrayI floatValue]:无法识别的选择器发送到实例 0x60000399ab20”

如何保持与 NSDictionnary 中接收到的声音相同的顺序?

来自服务器的 Json 响应:

     
   "status":true,
   "data":
      "גיהוץ":[
         
            "PriceListId":9,
            "ItemTypeId":18,
            "JobTypeId":5,
            "price":8.00,
            "LondryId":0,
            "ItemTypeDescription":"חולצה",
            "JobTypeDescription":"גיהוץ",
            "LondryName":""
         ,
         
            "PriceListId":962,
            "ItemTypeId":41,
            "JobTypeId":7,
            "price":40.00,
            "LondryId":0,
            "ItemTypeDescription":"מפה",
            "JobTypeDescription":"כביסה וגיהוץ",
            "LondryName":""
         
      ],
      "ניקוי יבש":[
         
            "PriceListId":15,
            "ItemTypeId":18,
            "JobTypeId":6,
            "price":28.00,
            "LondryId":0,
            "ItemTypeDescription":"חולצה",
            "JobTypeDescription":"ניקוי יבש",
            "LondryName":""
         ,
         
            "PriceListId":16,
            "ItemTypeId":19,
            "JobTypeId":6,
            "price":30.00,
            "LondryId":0,
            "ItemTypeDescription":"מכנסים",
            "JobTypeDescription":"ניקוי יבש",
            "LondryName":""
         ,
         
            "PriceListId":835,
            "ItemTypeId":99,
            "JobTypeId":6,
            "price":38.00,
            "LondryId":0,
            "ItemTypeDescription":"סווטשירט",
            "JobTypeDescription":"ניקוי יבש",
            "LondryName":""
         
      ],
      "כביסה וקיפול":[
         
            "PriceListId":128,
            "ItemTypeId":22,
            "JobTypeId":8,
            "price":66.00,
            "LondryId":0,
            "ItemTypeDescription":"שק כביסי אחד (עד 6 ק\"ג)",
            "JobTypeDescription":"כביסה וקיפול",
            "LondryName":""
         ,
         
            "PriceListId":956,
            "ItemTypeId":104,
            "JobTypeId":8,
            "price":99.00,
            "LondryId":0,
            "ItemTypeDescription":"שק כביסי אחד (עד 9 ק\"ג)",
            "JobTypeDescription":"כביסה וקיפול",
            "LondryName":""
         
      ],
      "כביסה עדינה":[
         
            "PriceListId":855,
            "ItemTypeId":102,
            "JobTypeId":83,
            "price":9.00,
            "LondryId":0,
            "ItemTypeDescription":"כביסה עדינה וייבוש בתליה יח'",
            "JobTypeDescription":"כביסה עדינה",
            "LondryName":""
         
      ]
   ,
   "message":""

【问题讨论】:

你收到的是数组还是字典?如果是数组,你是怎么放进字典的?字典是无序的。也许您可以编辑您的问题以显示您收到的 JSON 以及您想要实现的目标。 请看我的编辑,我想保持这个顺序 【参考方案1】:

你可以这样解决:

NSMutableArray *dataArr = @[].mutableCopy;
for (int i = 0 ; i < data.allKeys.count; i++) 
    NSString *key = data.allKeys[i];
    NSMutableDictionary *dataForKey = [data[key] mutableCopy];
    dataForKey[@"Key"] = key;
    [dataArr addObject:dataForKey];


NSSortDescriptor *desc = [NSSortDescriptor sortDescriptorWithKey:@"Key" ascending:YES];
dataArr =[dataArr sortUsingDescriptors:@[desc]];

您可以将来自服务器的 json 转换数据获取到 NSDictionary,然后使用此循环将所有项目添加到数组中,然后使用 Key 对这些项目进行排序。

【讨论】:

以上是关于目标 C:NSDictionary 无序的主要内容,如果未能解决你的问题,请参考以下文章

检查 NSDictionary 中的键 - 不使用布尔 NSNumber 作为值 @iOS8

JSON响应中NSDictionary内的对象数组-目标c

如何从目标 C 中的 NSDictionary 中检索字符串?

有没有办法在目标 C 中循环遍历 nsdictionary,其中键值未知且字典深度嵌套

目标 C:我正在尝试保存一个包含原语和对象的 NSDictionary,但是在我尝试添加自定义对象时发生错误

Foundation框架 - NSDictionary类NSMutableDictionary类