我有以下json
{
"status": 1,
"value": {
"shipment_master": {
"1": "Order Placed",
"2": "In Production",
"3": "Quality Check In progress",
"4": "Goods received for shipment",
"5": "Stuffing in progress",
"6": "Cargo Shipped"
}
}
}
我解析上面的json并将其添加到db,如下所示,
NSDictionary *valueDict = [jsonDic objectForKey:@"value"];
NSArray *details = [valueDict objectForKey:@"shipment_master"];
for (NSDictionary *response in details) {
NSManagedObjectContext *context = [self managedObjectContext];
// remove all rows
[context performBlockAndWait:^{
// add new row(s)
NSManagedObject *master = [NSEntityDescription insertNewObjectForEntityForName:@"ShipmentMaster" inManagedObjectContext:context];
NSError *error;
// TODO: set values here (e.g. [pendingShipment setValue:...)
[master setValue:[details valueForKey:response] forKey:@"values"];
// save MOC
if ([context hasChanges]) {
(void)[context save:&error];
}
}];
}
问题在于,当我再次获取数据时,这些值与从服务器接收的值不同。我的意思是orderplaced
来自in production
,quality check in prorgress
来自inproduction
之后等等......但是当我获取数据时,数据是无序的。是因为NSDictionary在解析json时以无序方式获取值吗?还是有其他原因吗?
我尝试将NSArray
更改为NSDictionary
,将valueForKey
更改为objectForKey
,但问题仍然存在。
以下是我更新的代码,
NSString* pendingResponse = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSData *jsonData = [pendingResponse dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:nil];
NSDictionary *valueDict = [jsonDic objectForKey:@"value"];
NSDictionary *details = [valueDict objectForKey:@"shipment_master"];
for (NSDictionary *response in details) {
NSManagedObjectContext *context = [self managedObjectContext];
// remove all rows
[context performBlockAndWait:^{
// add new row(s)
NSManagedObject *master = [NSEntityDescription insertNewObjectForEntityForName:@"ShipmentMaster" inManagedObjectContext:context];
NSError *error;
// TODO: set values here (e.g. [pendingShipment setValue:...)
[master setValue:[details objectForKey:response] forKey:@"values"];
// save MOC
if ([context hasChanges]) {
(void)[context save:&error];
}
}];
}
答案 0 :(得分:1)
如果您希望以特定顺序返回数据,则需要在搜索谓词中指定该数据。看起来你没有存储id,但如果订单很重要,你需要存储某种形式的索引。
let sortDescriptor = NSSortDescriptor(key: "id", ascending: true)
let sortDescriptors = [sortDescriptor]
request.sortDescriptors = sortDescriptors