のNSFetchedResultsController
データを取得する必要がありUITableView
ます。の作成中に、外部条件でデータをフィルタリングするNSFetchedResultsController
を作成します。NSPredicate
データを再取得する適切な方法は何ですか? my__fetchedResultsController
を nil して再作成するだけでは、少し残忍に思えます。
ありがとう!
のNSFetchedResultsController
データを取得する必要がありUITableView
ます。の作成中に、外部条件でデータをフィルタリングするNSFetchedResultsController
を作成します。NSPredicate
データを再取得する適切な方法は何ですか? my__fetchedResultsController
を nil して再作成するだけでは、少し残忍に思えます。
ありがとう!
上記の私のコメントに示されているように、私はそれを理解しました。あなたがする必要があるのは、への参照を保存し、NSFetchRequest
必要に応じてすぐに操作することです。NSFetchedResultsController
2 番目のステップとして、データを再度取得するように指示する必要があります。
これを行うには、デフォルトの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
)、外部依存関係が変更されるたびに呼び出すことです。それでおしまい。
initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:
ドキュメントには次のように記載されています。
重要:このメソッドを呼び出した後は、fetchRequest を変更しないでください。たとえば、その述語やソート順序を変更してはなりません。
reloadData
そのため、述語が変更されたときにFRC を再作成する (およびテーブル ビューを呼び出す) 必要があります。
編集:
同じ「NSFetchedResultsController Class References」にも次のように記載されています。
取得リクエストの変更
取得リクエストを単純に変更して結果を変更することはできません。取得リクエストを変更する場合は、次のことを行う必要があります。
- キャッシュを使用している場合は、それを削除します (deleteCacheWithName: を使用)。通常、フェッチ リクエストを変更する場合は、キャッシュを使用しないでください。
- 取得リクエストを変更します。
- performFetch: を呼び出します。
したがって、上記の最初の答えはおそらく間違っています。私がそれを正しく理解していれば:
controller.fetchRequest = newFetchRequest
つまり、FRC 自体を再作成する必要はありません。
(私は今それを手に入れたことを願っています:-)