0

ドキュメントに記載されている方法で、 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];
}

ここで必要なマングリングを行うことができました。それが最善のアプローチですか?「はい」と言って、いくつかの簡単なポイントを作ります。:) (またはさらに良いアプローチを提案します。)

4

1 に答える 1

0

それは私が考えることができる最もクリーンなアプローチのようです。エンティティがそれをフェッチした述語に戻ることができることを知る方法はありません。

于 2010-01-25T19:30:20.227 に答える