2010-05-05 91 views
0

我期待下面的代码将imageSet中的对象作为排序后的数组返回。相反,在排序前后没有区别。为什么我的对象不能使用sortedArrayUsingDescriptors进行排序?

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是在我的核心数据模型中定义的。我不知道为什么在托管对象上排序的工作与“常规”对象的工作方式不同,但可能很重要。

为了证明@“图像标识”应该作为描述符中的重点工作,这里的上述输出的两个日志循环的集合中的一个,我迭代通过什么:

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

我能为我做的工作代码最接近的适应。但是,这不能成为你的真实代码。 - [NSArray sortedArrayUsingDescriptors:]接受一个NSArray,这不是你传递的。 – Ken 2010-05-05 08:50:26

+0

实际上,allObjects从NSSet中返回一个NSArray,所以代码如图所示......一旦插入了dreamlax的解决方案。 – clozach 2010-05-05 16:31:17

回答

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]]; 
+0

谢谢,梦幻!我曾经知道这一点,但很容易忘记,逗号甚至是开始的运营商。我真的很感激:避免了数小时的额外焦虑。 – clozach 2010-05-05 16:29:21

+0

'allObjects'消息可以被删除,因为'NSSet'也有一个'sortedArrayUsingDescriptors:'方法,和'NSArray'一样。 – 2014-06-19 17:40:39

+0

@DouglasHill:该方法仅在iOS 4.0中引入,该问题在提问后被发布,因此对答案的更改不正确。 – dreamlax 2014-06-19 22:33:35

相关问题