Почему мои объекты не сортируются с помощью sortedArrayUsingDescriptors? - PullRequest
0 голосов
/ 05 мая 2010

Я ожидал, что приведенный ниже код вернет объекты в imageSet в виде отсортированного массива. Вместо этого нет никакой разницы в заказе до и после.

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"imageID" ascending:YES];
NSSet *imageSet = collection.images;

for (CBImage *image in imageSet) {
    NSLog(@"imageID in Set: %@",image.imageID);
}

NSArray *imageArray = [[imageSet allObjects] sortedArrayUsingDescriptors:(descriptor, nil)];    
[descriptor release];

for (CBImage *image in imageArray) {
    NSLog(@"imageID in Array: %@",image.imageID);
}

Fwiw, CBImage определено в моей базовой модели данных. Я не знаю, почему сортировка на управляемых объектах будет работать иначе, чем на «обычных» объектах, но, возможно, это имеет значение.

В качестве доказательства того, что @ "imageID" должен работать как ключ для дескриптора, вот что два цикла журнала выше вывода для одного из наборов, через которые я перебираю:

2010-05-05 00:49:52.876 Cover Browser[38678:207] imageID in Array: 360339
2010-05-05 00:49:52.876 Cover Browser[38678:207] imageID in Array: 360337
2010-05-05 00:49:52.877 Cover Browser[38678:207] imageID in Array: 360338
2010-05-05 00:49:52.878 Cover Browser[38678:207] imageID in Array: 360336
2010-05-05 00:49:52.879 Cover Browser[38678:207] imageID in Array: 360335

... За дополнительную плату я бы хотел получить общее решение для устранения неполадок с NSSortDescriptor (особенно, если это также относится к устранению неполадок NSPredicate). Функциональность этих вещей кажется мне совершенно непрозрачной, и поэтому отладка занимает вечность.

1 Ответ

2 голосов
/ 05 мая 2010

Я думаю, что проблема в этой строке:

... [[imageSet allObjects] sortedArrayUsingDescriptors:(descriptor, nil)];

В C (и, соответственно, Objective-C) оператор запятой работает, оценивая каждое подвыражение на предмет его побочных эффектов и используя результат последнего подвыражения как результат выражения в целом , Таким образом,

(descriptor, nil)

оценивается как nil. Не существует встроенного способа создания статического экземпляра NSArray (в отличие от использования @"str" для создания статических экземпляров NSString, например). Если вы хотите создать NSArray, вам нужно сделать это так:

... [[imageSet allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor, nil]];

Или, что эквивалентно

... [[imageSet allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...