0

NSFetchedResultsControllerデータを取得する必要がありUITableViewます。の作成中に、外部条件でデータをフィルタリングするNSFetchedResultsControllerを作成します。NSPredicateデータを再取得する適切な方法は何ですか? my__fetchedResultsControllerを nil して再作成するだけでは、少し残忍に思えます。

ありがとう!

4

2 に答える 2

0

上記の私のコメントに示されているように、私はそれを理解しました。あなたがする必要があるのは、への参照を保存し、NSFetchRequest必要に応じてすぐに操作することです。NSFetchedResultsController2 番目のステップとして、データを再度取得するように指示する必要があります。

これを行うには、デフォルトのNSFetchedResultsController「スタック」に 2 つの新しいメソッドを追加しました。

- (void)configureFetchRequest {  
    NSObject *myExternalDependency = …;

    if (!__fetchRequest) {
        __fetchRequest = [[NSFetchRequest alloc] init];
    }

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:self.managedObjectContext];
    [__fetchRequest setEntity:entity];

    NSPredicate *filter = [NSPredicate predicateWithFormat:@"someValue == %@", [myExternalDependency someProperty]];
    [__fetchRequest setPredicate:filter];
}

- (void)performFetch {
    NSError *error = nil;
    if (![self.fetchedResultsController performFetch:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
}

したがって、私が基本的に行っていることは、作成時にこれら 2 つのメソッドを呼び出し__fetchedResultsController(もちろん、 を使用して初期化します__fetchRequest)、外部依存関係が変更されるたびに呼び出すことです。それでおしまい。

于 2012-08-14T14:33:39.200 に答える
0

initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:ドキュメントには次のように記載されています。

重要:このメソッドを呼び出した後は、fetchRequest を変更しないでください。たとえば、その述語やソート順序を変更してはなりません。

reloadDataそのため、述語が変更されたときにFRC を再作成する (およびテーブル ビューを呼び出す) 必要があります。

編集:

同じ「NSFetchedResultsController Class References」にも次のように記載されています

取得リクエストの変更

取得リクエストを単純に変更して結果を変更することはできません。取得リクエストを変更する場合は、次のことを行う必要があります。

  1. キャッシュを使用している場合は、それを削除します (deleteCacheWithName: を使用)。通常、フェッチ リクエストを変更する場合は、キャッシュを使用しないでください。
  2. 取得リクエストを変更します。
  3. performFetch: を呼び出します。

したがって、上記の最初の答えはおそらく間違っています。私がそれを正しく理解していれば:

  • FRC に割り当てられたフェッチ要求を変更することはできません。
  • ただし、上記の 3 つの手順に従えば、 (新しい述語を使用して)新しいフェッチ要求を作成し、それを FRC ( ) に割り当てることができます。controller.fetchRequest = newFetchRequest

つまり、FRC 自体を再作成する必要はありません。

(私は今それを手に入れたことを願っています:-)

于 2012-08-13T11:14:32.107 に答える