Почему мои результаты сортировки возвращаются как совершенно случайные? - PullRequest
0 голосов
/ 06 ноября 2011

мой массив 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 ]

6 голосов
/ 06 ноября 2011
[[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];

Также странно, что вы назвали свои словари array1 и array2 - они не являются массивами.


Редактировать: В качестве альтернативы, вы можете позволить 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];
}
2 голосов
/ 06 ноября 2011

Метод -objectForKey: возвращает указатель на объект NSNumber.Он не может быть напрямую приведен к номеру, позвоните [NSNumber intValue], чтобы получить значение этого объекта.

Однако, возможно, вы захотите сделать это проще:

jokesArray = [unSortedContentArray sortedArrayUsingDescriptors:
              [NSArray arrayWithObject:
               [[NSSortDescriptor initWithKey:@"created.sec"
                                    ascending:YES] autorelease]]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...