2009-08-28 15 views
12

AppleのiPhone 3.0 SDKのCore Dataサポートには新しく、iPhone開発は比較的新しいです。私の質問は、ドキュメントで扱っているよりもやや複雑なソートです。私は間違った、基本的な仮定をしていると思う。オブジェクトグラフを使用して管理対象オブジェクトのNSMutableArrayをソートする方法

プリフェッチされた管理対象オブジェクトのコレクションを、コレクション内の複数のレイヤーに含まれるプロパティでソートするにはどうすればよいですか?

例: ファームカウボーイ(Farm.cowboys)に多くの1 カウボーイ1人(Cowboy.person) 人有するlastNameの(Person.lastName)

オブジェクト全体に1を有し有しますグラフが取得され、カウボーイがUITableViewを介して表示されます。さて、私はどのようにlastNameでカウボーイズを並べ替えるのですか?再フェッチする必要がありますか?はいの場合は、ネストされた並べ替えを使用してこれを行うにはどうすればよいですか?

現在、カウボーイのNSMutableArray([Farm.cowboys allobjects])をソートしようとしていますが、これはカウボーイのプロパティで問題ありません。しかし、私はCowboy.person.lastNameによってカウボーイのコレクションを並べ替えるときに、この作業をどうやって行うのか分かりません。

答えて

0

うまくいけば誰かがより良いソリューションを持っていることを望みます。しかし....

比較セレクタとソートオブジェクトへの参照があるラッパーオブジェクトが機能します。私が望むほどクリーンではないので、他の誰かが別の方法を思いついてくれることを願っています。

本質的に、カウボーイラッパーはカウボーイプロパティを持っています。 CowboyWrapperには比較セレクタもあります。 CowboyWrappersのNSMutableArrayを構築して同期化することで、ソートが動作します。

21

10.6をターゲットにできる場合は、ブロックを使用してこれを達成できます。これと同じように:

- (NSArray *)sortedArray { 
    return [originalArray sortedArrayUsingComparator:(NSComparator)^(id obj1, id obj2){ 
    NSString *lastName1 = [[obj1 person] lastName]; 
    NSString *lastName2 = [[obj2 person] lastName]; 
    return [lastName1 caseInsensitiveCompare:lastName2]; }]; 
} 
+2

を使用しますが、 'NSMutableArray'を使用している場合、あなただけの' sortUsingComparatorを使用することができます: '代わりに、あなたがしたい場合。 –

+0

キャストをNSComparatorに削除する必要があります。 – Psycho

5

あなたはそうのように並べ替えることができます: ''

[myUnsortedArrayOfCowboys sortedArrayUsingDescriptors: 
    [NSArray arrayWithObject: 
     [NSSortDescriptor 
      sortDescriptorWithKey:"person.lastName" 
      ascending:YES]]]; 

お知らせソート・ディスクリプタ・キーに格納します。これは、オブジェクトグラフをトラバースする方法です。あなたが番号と文字列をソートしたい場合は

1

その後、注目に値する。またこの

NSArray *unsortedArray = [NSArray arrayWithObjects:@"Hello", @"4", @"Hi", @"5", @"2", @"10", @"1", nil]; 
NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^(id firstObject, id secondObject) { 
    return [((NSString *)firstObject) compare:((NSString *)secondObject) options:NSNumericSearch]; 
}]; 
関連する問題