按日期排序JSON数据

时间:2014-05-16 14:52:01

标签: objective-c json sorting date

您好我从JSON文件在线获取数据,我正在尝试按日期降序排序,我在使用RSS提要使用XML解析器并尝试使用相同的概念之前完成了它似乎无法得到它并且每次都崩溃。

   NSData *data = [NSData dataWithContentsOfURL:url];
   NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

   NSDictionary *dataDict = [dict objectForKey:@"data"];
   NSArray *array = [dataDict objectForKey:@"items"];

   for (int i=0; i<[array count]; i++) {


    SongInfo *song = [[SongInfo alloc]init];
    NSMutableDictionary *entry = [array objectAtIndex:i];
    song.uploaded = [entry objectForKey:@"uploaded"];
    song.uploader = [entry objectForKey:@"uploader"];


    NSComparator comparator = ^(NSDictionary *a, NSDictionary *b) {
        return [a[@"uploaded"] compare:b[@"uploaded"]];
    };
    NSUInteger index = [songsArray indexOfObject:entry
                              inSortedRange:NSMakeRange(0, [songsArray count])
                                    options:NSBinarySearchingInsertionIndex
                            usingComparator:comparator];

    [songsArray insertObject:song atIndex:index];

编辑:通过使用NSSortDescriptor并将其放入一个数组然后返回到同一个数组中来管理修复它,不确定是否有更好的方法来执行此操作但这就是我这样做的方法......

    NSSortDescriptor *sortDescriptor;
    sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"uploaded"
                                                 ascending:NO];
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    NSArray *sortedArray;
    sortedArray = [songsArray sortedArrayUsingDescriptors:sortDescriptors];

    songsArray = [NSMutableArray arrayWithArray:sortedArray];
   // [songsArray addObject:[song copy] atIndex:index];

   [songsArray addObject:song];

2 个答案:

答案 0 :(得分:2)

您将在songsArray中插入的对象与包含两个词典的比较器进行比较。似乎比较器应该比较SongInfo对象而不是NSDictionaries。

答案 1 :(得分:1)

我们看不到是什么歌曲。像你一样手动创建排序数组效率非常低。相反,调用NSArray方法sortedArrayUsingComparator,并且不需要创建SongInfo对象。

另一方面,如果你想要一个SongInfo *数组,首先用JSON数据中的所有SongInfo创建该数组作为NSMutableArray,然后通过调用sortUsingComparator对该数组进行排序。

请注意,在比较器块中,您实际上可以使用对象的类型:因此在第一种情况下NSDictionary *而不是id,在第二种情况下使用SongInfo *而不是id。