13

NSFetchedResultsController(NSFRC) を使用して情報を に表示していUITableViewます。ユーザーがセルをアルファベット順ではなくセクションごとに並べ替えるオプションを作成しようとしています。問題は、ダウンロードされた情報を使用してセクションが決定されることです。これに加えて、各項目のセクションは比較的頻繁に変更されるため、セクションを保存したくありません。同様の問題の調査で、一時的な属性の言及に気づきましたが、データが既に読み込まれたらすべての計算が行われることを念頭に置いて使用できるかどうかわからない前に、これらを使用したことはありません、また、このソリューションが以前の と互換性があることも望んでいCore Data databaseます。また、私はCore Data, (それもObjective-C!) が特に得意ではないので、これをどのように行うか完全にはわかりません。

したがって、一時的な属性を使用している場合は、次のことを行います (一時的な属性が正しい方法であるかどうかわからないため、この次のビットは理論的なものです)。0 ~ 3 の 4 つのセクションが必要です (TableView delegate並べ替えの問題を回避するために、 を使用して名前を変更します)。計算が完了すると、各セルに一時属性が割り当てられます (必要な場合、デフォルトのセクションは 2 になります)。これがすべて理にかなっていることを願っています。

さて、いくつかの理論的なコードについて説明します。最初に、データ モデル画面で一時的なプロパティを作成し、一時的なチェック ボックスをオンにして一時的なものにします... とても簡単に聞こえます。

の計算のコードwillDisplayCell(いくつかの理由から wDC で実行する必要があります) では、エンティティは次のように保存できます。

MyEntity *myEntity = [self.fetchedResultsController objectAtIndexPath:indexPath];

myEntity.sectionTransientProperty = 2;

if (![self.managedObjectContext save:&error]) {
    NSLog(@"Error: %@", error);
    FATAL_CORE_DATA_ERROR(error);
    return;
}  

できましたよね?それが一時的なプロパティに値を割り当てる方法ですか?

次に、割り当て時に NSFRC の並べ替えオプションを変更します。

fetchedResultsController = [[NSFetchedResultsController alloc]
                                initWithFetchRequest:fetchRequest
                                managedObjectContext:self.managedObjectContext
                                sectionNameKeyPath:@"sectionTransientProperty"
                                cacheName:@"MyEntity"];

他に何をする必要がありますか?それとも、私はこれをひどく間違っていたので、あきらめるべきCore Data and NSFRC?です。もし皆さんが私をガイドしてくれたら、本当に感謝しています. さらにコードを投稿する必要がある場合は、喜んで投稿します。

よろしく、
マイク

4

1 に答える 1

28

セクションを含む FRC が必要な場合は、フェッチ要求にソート記述子を追加する必要があります。そのソート記述子は、一時的な属性に基づくことはできません。

initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:`のドキュメントを参照してください。

コントローラーがセクションを生成する場合、配列内の最初のソート記述子を使用して、オブジェクトをセクションにグループ化します。そのキーは sectionNameKeyPath と同じであるか、そのキーを使用する相対順序が sectionNameKeyPath を使用する順序と一致する必要があります。

「コア データ プログラミング ガイド」のフェッチ述語とソート記述子:

一方、SQL ストアは述語とソート記述子を SQL にコンパイルし、データベース自体で結果を評価します。これは主にパフォーマンスのために行われますが、Cocoa 以外の環境で評価が行われることを意味するため、Cocoa に依存するソート記述子 (または述語) は機能しません。サポートされているソート セレクタは次のとおりです。
さらに、SQLite ストアを使用して一時プロパティをソートすることはできません。

つまり、一時的な属性だけでセクションを作成することはできません。セクションの順序を作成する永続的な属性が必要です。

更新:一時的な属性をそのまま使用する一般的な方法sectionNameKeyPath: オブジェクトに「timeStamp」属性があり、オブジェクトを 1 か月に 1 つのセクションでセクションにグループ化する必要があります (iOS 開発者ライブラリのDateSectionTitlesサンプル コードを参照してください)。この場合、あなたは

  • 永続的な属性「タイムスタンプ」、
  • フェッチ要求の最初のソート記述子として「timeStamp」を使用し、
  • として使用される一時属性「sectionIdentifier」sectionNameKeyPath。「sectionIdentifier」は「timeStamp」から計算され、「2013-01」など、タイムスタンプの年と月を表す文字列を返します。

FRC が最初に行うことは、取得したすべてのオブジェクトを「timeStamp」属性に従ってソートすることです。次に、オブジェクトは「sectionIdentifier」属性に従ってセクションにグループ化されます。

したがって、FRC がオブジェクトをセクションにグループ化するには、永続的な属性が本当に必要です。最も簡単な解決策は、永続属性「sectionNumber」をエンティティに追加し、それを「sectionNameKeyPath」最初の並べ替え記述子に使用することです。

于 2013-01-05T12:07:07.340 に答える