順序付けられた対多関係に基づいて記述子を並べ替える 質問する

順序付けられた対多関係に基づいて記述子を並べ替える 質問する

コアデータモデルの説明:

  • プロジェクトと問題エンティティ
  • プロジェクトには順序付き 1 対多の関係問題という名前の問題
  • 問題は、parentProject という名前のプロジェクトと 1 対 1 の関係にあります。

問題を取得するためのコードは次のとおりです。

let fetchRequest = NSFetchRequest(entityName: "Issue")
    fetchRequest.predicate = NSPredicate(format: "parentProject CONTAINS[cd] %@", argumentArray: [project])
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]

    let frc = NSFetchedResultsController(
        fetchRequest: fetchRequest,
        managedObjectContext: dataManager.context,
        sectionNameKeyPath: nil,
        cacheName: nil)

    return arc

プロジェクト オブジェクトからすべての問題を取得しているにもかかわらず、フェッチされた結果コントローラーを使用して問題を取得することを好みます。これにより、問題は常に更新され、テーブルとの統合が気に入っています。また、プロジェクトが表示される前のナビゲーション コントローラー画面でも、FRC を使用してプロジェクトが表示されるのが気に入っています。

コードを見るとわかるように、問題は名前パラメータによってソートされています。

ただし、プロジェクトの NSMutableOrderedSet に保存した順序で並べ替えたいと思います。

私の知る限り、Core Data で使用する場合、コンパレータ/セレクターで NSSortDescriptor を使用することはできません。

やり方はご存知ですか?よろしくお願いします。

ベストアンサー1

リレーションシップキーパス(あなたの場合parentProject)を使用すると、順序付けられたセットに従ってソートされます。

fetchRequest.sortDescriptors = [NSSortDescriptor(key: "parentProject.name", ascending: true),NSSortDescriptor(key: "parentProject", ascending: true)]

これにより、まずプロジェクトごとに並べ替えられ、次に各プロジェクト グループ内で、関係内の順序セットと同じ順序で並べ替えられます。オプションで、 を使用して各課題のプロジェクトを別のセクションに配置することもできますsectionNameKeyPath

parentProject.name最初に(またはそれに似たもの - など)を使用しない場合parentProject.lastUpdated、orderedSet の順序に従ってのみソートされます。つまり、最初の問題がすべて表示され、次に 2 番目の問題がすべて表示されます。これはおそらく、必要な結果ではありません。

おすすめ記事