13

ここに画像の説明を入力してください-私はItemエンティティとエンティティを持っていTagます。-アイテムは複数のタグを持つことができ、タグは複数のアイテムにリンクできます(多対多の関係)。-関係は、双方向で「順序付き関係」(IOS5の順序付き関係を使用)です。

特定のアイテムのすべての子タグを取得したい

次のフェッチ要求を使用しています。

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Item"];

// Fetch all items that have a given tag
Tag* myTag = ....;
request.predicate = [NSPredicate predicateWithFormat:@"ANY tag == %@", myTag];

// This is my attempt to get the correct sort ordering (it crashes)
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"tag"
                                                                 ascending:YES];
request.sortDescriptors = @[sortDescriptor];

上記のソート記述子はデータを返しますが(これはある順序であると思います)、その後クラッシュします:

[_NSFaultingMutableOrderedSet compare:]: unrecognized selector sent to instance 0x10b058f0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 
'-[_NSFaultingMutableOrderedSet compare:]: unrecognised selector sent to instance 0x10b058f0'

空のソート記述子配列を指定すると、クラッシュは発生しませんが、結果は順序付けられません。

iOS5の順序付きリレーションシップ機能を使用して、多対多のリレーションシップでソート記述子を正しく実装するにはどうすればよいですか?

4

1 に答える 1

16

CoreDataで順序付けられた関係が何を意味するのかを誤解しているのではないかと思います。この質問によると、「ordered」は「一部のプロパティに関して」を意味するのではなく、「ordered」は「ユーザーの順序を保持する」(または他の方法では任意に見える別の特定の順序)を意味します。いくつかの例:

  • 順序付けられた関係は、レシピのステップに適しています(AppleのCore Dataリリースノートの例)-ステップは、プロパティ(テキストなど)のいずれかに関して必ずしも順序付けられるとは限らず、「 Core Dataが順序付けを行わなかった場合は、「index」または「order」プロパティを単独で使用します。
  • 順序付けられた関係は、名前のリストには適していません。たとえば、ユーザーは名前または名前で並べ替えることができ、名前のコレクションには、内部的に実際の固有の順序はありません。重要なのは表示順序だけです。データ自体がその順序を維持する必要はありません。(Appleのドキュメントの経験則では、ユーザーがソート指定子から選択できると考えられる場合、その関係はCore Dataで並べ替えるべきではありません。)

あなたの場合、あなたはあなたがフェッチしている順序付けられたセットのセット(プロパティの値)にソート記述子を適用しようとします。tagsこれがクラッシュの原因です。NSOrderedSetサブクラス(この場合は)は、並べ替え記述子がそれらを並べ替えるために使用するメソッドを_NSFaultingMutableOrderedSet実装していないため、その例外が発生します。-compare:

ソート記述子をまったく使用しないのが良い解決策だと思います。代わりに、ユーザーに表示するために保持されている順序を変更する場合は、tagsあるアイテムのNSOrderedSet値を取得してから、を使用して独自の並べ替えで配列を取得します-sortedArrayUsingComparator:。これにより、Core Dataでデータが正しい順序に保たれますが、プログラムで自分で並べ替えることができます。

より高いレベルでは、あなたはまた、あなたがあなたの関係において本当に秩序を必要とするかどうかを検討したいかもしれません。パフォーマンスが大幅に低下し、実際に返されるのは、タグがアイテムに追加された元の順序(またはその逆)だけです。タグを表示するたびにその順序を変更する場合は、パフォーマンスに大きな影響を与えることはありません。関係を順序付けせずに、プログラムで並べ替えを続行するか、、などの集計キーで並べ替え記述子を使用しますtags.@count。コメントで示唆されているように。

于 2012-09-11T16:27:44.687 に答える