2011-08-26 5 views
14

例は、そのコードを見 NSFetchedResultsControllerでFetchRequestを変更できないのはなぜですか?私はNSFetchedResultsControllerがListControllerで呼ばれている

+(NSFetchRequest *)fetchRequestInContext: (NSString*) entityName : (NSPredicate *) predicate : (NSString*) sortKey : (BOOL) sortAscending; 

+(NSFetchedResultsController *) searchControllerInContext: (NSString*) entityName : (NSPredicate *) predicate : (NSString*) sortKey : (BOOL) sortAscending 
{ 
    NSFetchRequest *request = [self fetchRequestInContext:entityName :predicate :sortKey :sortAscending]; 

    NSFetchedResultsController * FRC=[[[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:[ThreadClass managedObjectContext] sectionNameKeyPath:Nil cacheName:Nil]autorelease]; 
    NSLog(@"FRC : %@",FRC); 
    return FRC; 
} 

FetchController

と呼ばれ、私はNSFetchedResultsControllerを作成し、このコードでそれをperfomしたいとき、私はsearchControllerInContextを呼び出す:

if (![[self ListController].FetchController performFetch:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

問題があります私はいつも実行したいと思います。要求が変更されたときに取得します。簡単にしたいです。

[self ListController].FetchController.fetchRequest=[self FunctionTogetNewRequest]; 

しかし、[self ListController] .FetchController.fetchRequestは読み込み専用です..

私は実行したくないのでこれをしたいと思います。

つまり、ユーザーが検索ボックスに入れたレコードに基づいてレコードを提供するプログラムがある場合、検索ボックスの内容が変更されるたびに新しいコントローラを作成する必要がありますか?それは不思議です。私はNSFetchedResultsControllerを使用することの全体的なポイントは私たちがそれを行う必要はないと思った?

答えて

23

fetchRequestは読み取り専用プロパティですが、変更することはできます。たとえば、フェッチ要求の述語を設定すると、結果をキャッシュしていない限り(またはキャッシュを最初に削除している限り)正常に機能します。私はこの技術をいくつかのプロジェクトで成功裡に使用してきました。フェッチ要求を変更したら、performFetchに再度電話する必要があります。

ボトムライン:検索用語が変更されるたびにFRCを作成する必要はありません。キャッシュを削除し、フェッチ要求の述語を変更し、既存のインスタンスで新しい結果セットをフェッチします。

+0

結果をキャッシュするとどうなりますか?結果をキャッシュしないとperformFetchをもう一度呼び出す必要がありますか? –

+0

フェッチ要求を変更すると、キャッシュされた結果が無効になります。フェッチ要求を変更するたびに、結果セットを再フェッチする必要があります。 –

+3

これがうまくいくかもしれませんが、Appleのドキュメントに書かれているものを考慮してください: '重要な このメソッド[NSFetchedResultsController initメソッド]を呼び出した後、fetchRequestを変更してはいけません。たとえば、述語やソート順序を変更してはいけません。 ' – fabb

10

検索ボックスに 内容の変更をするたびに私は、 検索ボックスに入れてどのようなユーザーに基づいてレコードを与えるプログラムを持っている私は、新しいコントローラを作成する必要がありますか?

はい、新しいコントローラの生成が必要なフェッチで述語を変更するためです。

私はNSFetchedResultsControllerを使用することの全体的なポイントがそうだと私は考えています これを行う必要はありませんか?

FRCのポイントは、コンテキストとテーブルビューの間の対話を自動的に処理することです。セクションと行を返す専用のプロパティと、データモデルの変更に応じてテーブルを変更するメソッドを委譲します。 FRCはフェッチによって定義されるので、フェッチを変更するときは、新しいFRCを生成する必要があります

FRCの考え方を間違えてしまうと、そうではありません。必要に応じて多数のFRCを作成して廃棄することに問題はありません。

関連する問題