Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 为什么不';我的物品是否使用描述符进行分类?_Iphone_Objective C_Sorting_Core Data - Fatal编程技术网

Iphone 为什么不';我的物品是否使用描述符进行分类?

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

我希望下面的代码以排序数组的形式返回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的故障排除)。这些东西的功能对我来说似乎是完全不透明的,因此调试需要花费很长时间。

我认为问题在于这一行:

... [[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了,我觉得答案已经过时了。