ios - 目标 C:NSDictionnary 无序
问题描述
我从 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":""
}
解决方案
你可以这样解决它:
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 对这些项目进行排序。
推荐阅读
- plugins - 如何修复错误:Flutter 中的“返回类型 'SliverStaggeredGrid' 不是 'Widget',由匿名闭包定义”?
- reactjs - TypeScript、React.ReactNode、withRouter 和 connect
- python - groupby("date") - 获取最小值和最大值的日期时间
- python - 如何将 self 和 2 个参数传递给线程
- android - 应用程序的顶部如何调用。安卓编程
- javascript - Knoockout 计算的可观察写入不更新
- assembly - GNU AS 值不在指定部分
- css - Bootstrap 对齐字体真棒图标
- python - 分配给列表功能不起作用
- javascript - 未捕获的类型错误:无法读取 null Knockout js 的属性“地图”