我希望下面的代码能够将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故障排除)。这些东西的功能对我来说似乎完全不透明,因此调试需要永远。
答案 0 :(得分:2)
我认为问题在于这一行:
... [[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]];