CoreDataTableViewController
(スタンフォード クラス) のサブクラスである UITableViewController があります。を実装しfetchedResultsController
ます。
今、私の中にviewWillAppear
、私はこれを持っています:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if(!self.managedObjectContext) {
[self useManagedDocument];
}
}
managedObjectContext
持っていない場合は初期化し、ヘルパークラスから取得します。MOC セッターで、以下を初期化しますfetchedResultsController
。
- (void)setManagedObjectContext:(NSManagedObjectContext *)managedObjectContext
{
_managedObjectContext = managedObjectContext;
if(self.managedObjectContext) {
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:CD_ITEM_ENTITY_NAME];
request.sortDescriptors = @[[NSSortDescriptor
sortDescriptorWithKey:CD_ITEM_NAME_PROPERTY
ascending:YES
selector:@selector(localizedCaseInsensitiveCompare:)]];
request.predicate = nil;
self.fetchedResultsController = [[NSFetchedResultsController alloc]
initWithFetchRequest:request
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:nil
cacheName:nil];
} else {
self.fetchedResultsController = nil;
}
}
プログラムが起動すると、テーブル データが正しく読み込まれ、デバッガーはフェッチ要求が行われたと表示します。ただし、Core Data グラフにデータを挿入して保存すると、コンテキストが変更され、次のデリゲート メソッドが起動されます。
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
/*NSError *error;
[controller performFetch:&error];
if(error) {
NSLog(@"%@", error);
}
[self.tableView reloadData];*/
}
うまくいかなかったのでコメントしました。基本的に、私がやりたいことは、コンテキストが変わるたびにデータをリロードすることです。別のView Controllerにアイテムを追加してからこのView Controllerに戻ると、その場合もリロードする必要があります。
これを実装するにはどうすればよいですか?performFetch
私はそのデリゲートメソッドでやってみましたが、それに入りました(内部にブレークポイントを設定してチェックしました)が、performFetch
何もせず、テーブルがリロードされませんでした。
モーダル VC (アイテムを管理するための別の VC) にアイテムを追加すると、ロガーで次のようになります。
2013-05-10 22:41:38.264 App1[7742:c07] [ItemCDTVC performFetch] fetching all Item (i.e., no predicate)
2013-05-10 22:41:46.454 App1[7742:c07] NSManagedObjects did change.
2013-05-10 22:41:46.456 App1[7742:c07] NSManagedContext did save.
アプリを閉じても、マルチタスク バーから終了せずに再度開いても、何もしません。フェッチなし。コンテキストが変更されていない場合は、リクエストを発行したくありませんが、ユーザーが別の ViewController にアイテムを追加してから、すべてのアイテムを一覧表示する ItemCDTVC に戻ったとします。デリゲート メソッドを呼び出してテーブルを更新できるように、コンテキスト変更通知を受け取りますviewWillAppear
か? 現在、アプリのロード時に一度だけ実行するように設定しています。