为什么我的排序结果会以完全随机的方式返回?

时间:2011-11-06 00:52:46

标签: objective-c ios nsarray

我的数组jokesarray具有如下元素。我试图按嵌套元素“sec”排序。

每当我运行这个时,我会得到一个不同的排序顺序或每次我回到同一个视图(我的排序代码在viewwillappear中)。为什么呢?

    {
       "4eb57e72c7e24c014f000000" : {
         "_id" : {
           "$id" : "4eb57e72c7e24c014f000000"
         },
         "author" : "tim",
         "comments" : [],
         "created": {
           "sec" : 1320517234,
           "used" : 856000
         },
         "picture" : "http://someurl.com",
         "text" : "this is a test",
         "title" : "test",
         "type" : ["test"]
       }

    jokesArray = [unSortedContentArray sortedArrayUsingFunction:Sort_Created_Comparer context:self]; 

    NSInteger Sort_Created_Comparer(id array1, id array2, void *context)
{

    int v1 = (int)[[array1 objectForKey:@"created"] objectForKey:@"sec"];
    int v2 = (int)[[array2 objectForKey:@"created"] objectForKey:@"sec"];
    if (v1 < v2)
        return NSOrderedAscending;
    else if (v1 > v2)
        return NSOrderedDescending;
    else
        return NSOrderedSame;
}

2 个答案:

答案 0 :(得分:6)

[[array1 objectForKey:@"created"] objectForKey:@"sec"]

返回指向对象的指针;在您的情况下,NSNumber对象。当你把它投射到int时:

(int)[[array1 objectForKey:@"created"] objectForKey:@"sec"]

您正在将该对象所在的内存地址转换为int值,因为-objectForKey:会返回指向对象的指针。

由于您对内存地址不感兴趣,而是对基础int值不感兴趣,请使用-[NSNumber intValue]

int v1 = [[[array1 objectForKey:@"created"] objectForKey:@"sec"] intValue];

此外,您将词典命名为array1array2很奇怪 - 它们不是数组。


修改或者,您可以让NSNumber为您进行比较:

NSInteger Sort_Created_Comparer(NSDictionary *d1, NSDictionary *d2, void *context)
{
    NSNumber *n1 = [[d1 objectForKey:@"created"] objectForKey:@"sec"];
    NSNumber *n2 = [[d2 objectForKey:@"created"] objectForKey:@"sec"];
    return [n1 compare:n2];
}

答案 1 :(得分:2)

方法-objectForKey:返回NSNumber对象指针。它不能直接转换为数字,请调用[NSNumber intValue]来获取此对象的值。

但是,你可能想要做的更简单:

jokesArray = [unSortedContentArray sortedArrayUsingDescriptors:
              [NSArray arrayWithObject:
               [[NSSortDescriptor initWithKey:@"created.sec"
                                    ascending:YES] autorelease]]];