2010-05-05 74 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

相關問題