2012-01-27 61 views
2

我有一個NSFetchRequest從核心數據獲取對象並使用一個微不足道的NSSortDescriptor對它們進行排序。我用一對夫婦取決於用戶選擇什麼樣不同的人,但他們是這樣的:NSSortDescriptor - 訂單是否已更改?

NSMutableArray *sortDescriptors = [NSMutableArray array]; 
    NSSortDescriptor *sortDescriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"ownerName" ascending:YES selector:@selector(caseInsensitiveCompare:)]; 
    NSSortDescriptor *sortDescriptor2 = [NSSortDescriptor sortDescriptorWithKey:@"petName" ascending:YES selector:@selector(caseInsensitiveCompare:)]; 
    [sortDescriptors addObject:sortDescriptor1]; 
    [sortDescriptors addObject:sortDescriptor2]; 
    [fetchRequest setSortDescriptors:sortDescriptors]; 

一切正常上的iOS5和5.1一如預期,但是當我測試在iPad上運行iOS4的完全相同的代碼。 2.1(或4.3模擬器),所有第一個排序描述符的順序相反。在這個例子中,所有者姓名是從Z到A的順序,但寵物正確訂購A到Z!

早期iOS版本中是否存在導致ascending布爾值錯誤的錯誤?另外,還有什麼我可能做錯了嗎?

編輯:第一個鍵(ownerName)用作NSFetchedResultsController部分。不確定這是否相關。

感謝克雷格

+0

如果您爲'ascending'參數傳遞'NO',您會得到正確的順序嗎? – Mundi 2012-01-27 22:57:36

+0

是的。我已經將第一個SD上的'升序'字符更改爲NO,然後反映了iOS5的結果。第二個SD仍然設置爲YES,並且該部分中的項目以相同的方式排序。奇怪的! – 2012-01-28 00:20:44

回答

0

只是猜測。

我有很好的結果,沒有指定caseInsensitiveCompare:

此外,嚴格來說NSFetchRequest預計NSArray作爲sortDescriptors參數,而不是NSMutableArray。在所有蘋果的示例代碼它通常是像這樣的

[fetchRequest setSortDescriptors: 
    [NSArray arrayWithObjects:sortDescriptor1, sortDescriptor2, nil]]; 

我有錯誤(使用可變的,而不是一成不變的),但往往也只是工程。也許改變這是值得一試的。

+0

謝謝!我試着刪除'caseInsensitiveCompare',但沒有什麼不同。我會嘗試將可變數組改爲數組,明天看看它是否有任何區別。 – 2012-01-28 00:27:34

+0

我可以確認這沒什麼區別:( – 2012-01-31 22:46:49

+0

關於'NSMutableArray'與'NSArray',因爲'NSMutableArray'是'NSArray'的一個子類,那麼當它通過時它會自動被強制轉換,所以這不會導致你任何問題在一個理智的面向對象系統中,每個子類都應該能夠支持它的超類。 – 2014-03-17 05:20:26