Iphone 为什么不';我的物品是否使用描述符进行分类?
我希望下面的代码以排序数组的形式返回imageSet中的对象。相反,前后的顺序没有区别Iphone 为什么不';我的物品是否使用描述符进行分类?,iphone,objective-c,sorting,core-data,Iphone,Objective C,Sorting,Core Data,我希望下面的代码以排序数组的形式返回imageSet中的对象。相反,前后的顺序没有区别 NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"imageID" ascending:YES]; NSSet *imageSet = collection.images; for (CBImage *image in imageSet) { NSLog(@"imageID in Set: %@",image
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的故障排除)。这些东西的功能对我来说似乎是完全不透明的,因此调试需要花费很长时间。我认为问题在于这一行:
... [[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]];
我能对你的代码进行的最接近的修改对我有用。但是,这不是您真正的代码-[NSArray SorterDarrayUsingDescriptors:]接受NSArray,这不是您要传递的内容。实际上,AllObject从NSSet返回NSArray,因此代码如图所示工作…一旦插入dreamlax的解决方案。谢谢,dreamlax!我曾经知道这一点,但很容易忘记逗号甚至是一开始的运算符。我真的很感激这一点:避免了数小时的(额外)焦虑。可以删除
allObjects
消息,因为NSSet
也有一个sortedarrayingdescriptor:
方法,其工作原理与NSArray
的工作原理相同。@DouglasHill:该方法仅在提出此问题后发布的iOS 4.0中引入,因此,对答案的更改是不正确的。最初发布时答案没有问题,但我们不再使用iOS 4了,我觉得答案已经过时了。