将JSON返回值排序为UITableView Sections和Rows

时间:2014-01-06 17:45:14

标签: ios objective-c json uitableview

我正在尝试根据每天将JSON返回分为多个部分。这是JSON返回,

sales =     (
                {
            "dis_dollars" = 0;
            "dis_percent" = 0;
            id = 111;
            saleDay = 5;
            saleMonth = 1;
            saleTime = "20:02:39";
            saleYear = 2014;
            "total_price" = 25;
        },
                {
            "dis_dollars" = 0;
            "dis_percent" = 0;
            id = 103;
            saleDay = 2;
            saleMonth = 1;
            saleTime = "19:13:41";
            saleYear = 2014;
            "total_price" = 79;
        },
                {
            "dis_dollars" = "0.55";
            "dis_percent" = "0.10000000149012";
            id = 101;
            saleDay = 2;
            saleMonth = 1;
            saleTime = "10:41:11";
            saleYear = 2014;
            "total_price" = 22;
        },

                {
            "dis_dollars" = 0;
            "dis_percent" = 0;
            id = 108;
            saleDay = 1;
            saleMonth = 1;
            saleTime = "11:00:00";
            saleYear = 2014;
            "total_price" = 66;
        }
    );
}

如果我这样做,我可以获得部分数量

//...Connect to php script and get return json object

int saleDay = 0;

//Loop through json return
for (int i = 0;i < [sales count]; i++) {
    NSDictionary* dict = [sales objectAtIndex:i];

    Sale *eachSale =[[Sale alloc]  initWithSaleId:[dict valueForKey:@"id"]
                                          saleDay:[dict valueForKey:@"saleDay"]
                                        saleMonth:[dict valueForKey:@"saleMonth"]
                                         saleYear:[dict valueForKey:@"saleYear"]
                                         saleTime:[dict valueForKey:@"saleTime"]
                                        saleTotal:[dict valueForKey:@"total_price"]
                                   saleDisDollars:[dict valueForKey:@"dis_dollars"]
                                   saleDisPercent:[dict valueForKey:@"dis_percent"]];


    NSLog(@"sale Day %@",eachSale.saleDay);
    [_salesList addObject:eachSale];

    int eachSaleDay = [eachSale.saleDay intValue];

    // if the next day is different from the one before it, add a new section.
    if (saleDay != eachSaleDay) {
        _saleDaysCount += 1;
        NSLog(@"eachSaleDay %i" ,eachSaleDay);
        NSLog(@"salesDayCount %i" ,_saleDaysCount);
    }

    saleDay = eachSaleDay;
}

这将为我提供正确数量的部分,但是如何根据当天对对象进行分组以找出每个部分的行数以及每行应该包含哪些对象?

我想我需要使用NSSort描述符,但我不确定在哪里实现它以及如何访问单个日期数组。

有什么建议吗?

由于

1 个答案:

答案 0 :(得分:0)

在循环搜索结果时,我只需添加一个NSNumber类型的附加字段,其中包含每个Sale的完整日期。

eachSale.saleDateIdentifier = @(eachSale.saleYear.intValue * 10000 +
                                eachSale.saleMonth.intValue * 100  +
                                eachSale.saleDay.intValue);

现在很容易排序和计算:

[_salesList sortUsingDescriptors:
   @[[NSSortDescriptor sortDescriptorWithKey:@"saleDateIdentifier" ascending:NO]]];

NSArray *allDates = [_salesList valueForKeyPath:@"saleDateIdentifier"];
NSSet *uniqueDates = [NSSet setWithArray:allDates];
NSArray *sortedUniqueDates = [uniqueDates sortedArrayUsingDescriptors:
   @[[NSSortDescriptor sortDescriptorWithKey:@"saleDateIdentifier" ascending:NO]]];

您的部分数量为sortedUniqueDates.count。对于每个部分,您可以使用saleDateIdentifier格式化titleForRowAtIndexPath中的日期字符串。

顺便说一句,也许你不想在valueForKey的init方法中使用eachSale。也许你的意思是objectForKey。更好的是,您应该键入Sale类的属性,并根据需要使用NSNumberNSString