3

私の人生の間、NSFetchedResultsControllerDelegateメソッドが基礎となるデータストアにデータを追加するときに、なぜ起動しないのかわかりません。 iPhoneアプリケーションを再起動すると、データがすぐに表示されます。NSFetchedResultsControllerDelegateが起動しない

私はのUITableViewControllerをサブクラス化し、NSFetchedResultsControllerDelegateに準拠しています

@interface ProjectListViewController : UITableViewController <NSFetchedResultsControllerDelegate> { 
    NSFetchedResultsController* fetchedResultsController_; 
    NSManagedObjectContext* managedObjectContext_; 
} 

私はNSFetchedResultsControllerをインスタンス化し、自己へのデリゲートを設定します。

// Controller 
fetchedResultsController_ = [[NSFetchedResultsController alloc] initWithFetchRequest:request 
    managedObjectContext:self.managedObjectContext 
                    sectionNameKeyPath:@"Client" 
                      cacheName:@"ProjectsCache"]; 
fetchedResultsController_.delegate = self; 

私はデリゲートメソッドを実装:

- (void)controllerWillChangeContent:(NSFetchedResultsController*)controller { 
    NSLog(@"ProjectListViewController.controllerWillChangeContent"); 
    // The fetch controller is about to start sending change notifications, so prepare the table view for updates. 
    [self.tableView beginUpdates]; 
} 

- (void)controllerDidChangeContent:(NSFetchedResultsController*)controller { ... } 
- (void)controller:(NSFetchedResultsController*)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { ... } 
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id<NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type { ... } 

保存したいエンティティを作成します。

Project* newProject = [NSEntityDescription insertNewObjectForEntityForName:@"Project" inManagedObjectContext:self.managedObjectContext]; 
ProjectDetailViewController* detail = [[ProjectDetailViewController alloc] initWithStyle:UITableViewStyleGrouped 
                       delegate:self 
                       selector:@selector(finishedAdding:) 
                       project:newProject]; 

以降、私はそれを保存します。

- (void)save { 
    // NSLog(@"ProjectDetailViewController.save"); 
    self.project.name = projectNameTextField_.text; 
    NSError* error; 
    BOOL b = [self.project.managedObjectContext save:&error]; 
    if (!b) { 
     NSLog(@"Error saving project!"); 
    } else { 
     NSLog(@"Project was successfully saved."); 
     [delegate_ performSelector:selector_ withObject:self.project]; 
    } 
    [self dismissModalViewControllerAnimated:YES]; 
} 

それはすべて私のデリゲートメソッドが発動しないという事実を除いて正常に動作します。明らかに私のテーブルビューは更新されず、新しいデータを見るための唯一の方法は、明示的にアプリケーションをリフレッシュまたは再起動することです。

私はCoreData Recipeアプリを見てきましたが、私が見逃しているものを見つけることができません。思考?

-luther

+0

ルーサー、NSFetchedResultsControllerを設定しているエンティティと述語を確認できますか? – ohhorob

答えて

3

私は元fetchedResultsController_を作成するとき、私は、nilに「クライアント」@からsectionNameKeyPathを変更した場合はProjectエンティティ作成と保存両方が実際にデリゲートメソッドを呼び出します!

fetchedResultsController_ = 
    [[NSFetchedResultsController alloc] initWithFetchRequest:request 
             managedObjectContext:self.managedObjectContext 
              sectionNameKeyPath:nil 
                cacheName:@"ProjectsCache"]; 

これは、CoreData Recipesの例で行われているハイパーチェックです。私のデータがより複雑になるにつれて、結果をセクションに分割するのに役立つ議論が必要になると思いますが、現在はデリゲートハンドラが呼び出されているのを見てうれしいです。

1

あなたは2 NSManagedObjectContexts、ProjectListViewControllerで1、およびProjectDetailViewControllerで別々のものを(私はそれが渡された表示されていないので、それが作成されると仮定し使用しているように上記の私の読み取りが見えます。

コンテキストを保存すると、自動的に変更内容を別のコンテキストに伝播しないため、ProjectDetailViewControllerに保存することでProjectListViewControllerのコンテキストに変更が反映されません。つまり、代理人に変更がないことを意味しますそれ。

コンテキスト間で変更をプッシュしたい場合は、NSManagedObjectContextDidSaveNotificationとmergeChangesFromContextDidSaveNotification:を見てください(NSManagedObjectContext documentationの終わりです)。

+0

私は見ている振る舞いを考えればあなたの意見は確かに理にかなっています。私は通知をうまく使って変更をマージすることができましたが、なぜそれが必要なのか理解できません。私は何かが足りない。 私は同じmanagedObjectContextを使用してfetchedResultsController_、 'newProject' を作成し、 'newProject'(コンテキストは元のmanagedObjectContextから作成された 'newProject'のプロパティです)を保存します。 [self.project.managedObjectContext save:&error]; 私が作成したときにデリゲートメソッドが起動し、 'newProject'を保存したときに、そのメソッドが起動されるはずです。 –