ドキュメントに記載されている方法で、 NSFetchedResultsControllerをほとんどそのまま使用しています。これが私のコードの抜粋です。
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SomeEntity"
inManagedObjectContext:moc];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"id" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptors release];
NSPredicate *somePredicate = [NSPredicate predicateWithFormat:@"ANY buckets.name == %@", bucketId];
[fetchRequest setPredicate:somePredicate];
frc = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:moc
sectionNameKeyPath:@"titleAccessor"
cacheName:@"frc"];
[fetchRequest release];
次の 2 つの点に注意してください。
1) 述語。私のデータ モデルでは、SomeEntity とバケットは多対多の関係にあります。述語は、「関連するバケット オブジェクトがこの名前を持つすべての SomeEntity オブジェクトを返す」ことを示しています。期待どおりに動作します。
2) sectionNameKeyPath を使用しています。これは、実際にはモデル オブジェクト内のメソッドであり、アプリ ロジックに従って何らかの計算を行い、タイトルを返します。期待どおりに動作します。
さて、質問:
これら 2 つのことを結び付けて、"titleAccessor" メソッドに述語を認識させるにはどうすればよいですか? 述語に応じてセクションのタイトルを変えたいと思います(正確には、述語で使用しているbucketIdに応じて)。明確にするために:
現在、titleAccessor は次のように機能します。
return @"result of some calculation"
私はそれを機能させたい:
if (bucketId == a):
return @"aPrefix" + @"result of some calculation"
else if (bucketId == b):
return @"bPrefix" + @"result of some calculation"
私には 2 つの考えがあります。1) これが通常の CD フェッチである場合 (そのようなものがある場合)、モデル オブジェクトの揮発性プロパティを設定して、それを使用することができます。しかし、NSFetchedResultsController 結果オブジェクトにアクセスできません。2) これが SQL の場合、「何とか a、b、c を「何か」として選択」のようなことをします。実行時に、「c」が目的の値になり、それをプロパティとして使用できます。しかし、これは SQL ではありません。:)
上記の目的の動作を実現するにはどうすればよいですか?
更新:
もちろん、質問を投稿した直後に自分で答えを見つけます。(投稿は治療の一部だと思います。)ドキュメントにあるように、tableviewcontrollerデリゲートに次のものを入れたことに気付きました:
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[frc sections] objectAtIndex:section];
return [sectionInfo name];
}
ここで必要なマングリングを行うことができました。それが最善のアプローチですか?「はい」と言って、いくつかの簡単なポイントを作ります。:) (またはさらに良いアプローチを提案します。)