Pergunta

Eu não consigo entender porque, para a vida de mim, os métodos NSFetchedResultsControllerDelegate não estão disparando quando eu adicionar dados para o armazenamento de dados subjacente. Os dados mostram imediatamente se eu reiniciar o aplicativo iPhone.

Eu tenho uma subclasse UITableViewController e em conformidade com NSFetchedResultsControllerDelegate:

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

Eu instanciar o NSFetchedResultsController e definir o delegado to self:

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

Eu implementar os métodos de delegado:

- (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 { ... }

Eu crio a entidade que deseja salvar:

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

E depois, eu salvá-lo:

- (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];
}

Tudo funciona bem, exceto pelo fato de que os meus métodos de delegado não fazer fogo. Obviamente que a minha vista de tabela não é atualizado e a única maneira de ver os novos dados é atualizar explicitamente ou reiniciar o aplicativo.

Eu olhei através do aplicativo Receita CoreData - mas não consigo encontrar o que eu estou sentindo falta. Pensamentos?

-Luther

Foi útil?

Solução

Se eu mudar o sectionNameKeyPath de @ "Cliente" a zero quando eu criar o fetchedResultsController_ original, tanto a entidade Project criação e Salvar , de fato chamar os métodos de delegado

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

Após exame hiper, que é o que o exemplo CoreData Recipes faz. Como os meus dados se torna mais complexa -. Eu acho que eu vou precisar que o argumento para ajudar a quebrar os resultados em seções, mas por agora, é bom ver os manipuladores de delegado a ser invocado

Outras dicas

A minha leitura dos olhares acima como você está usando 2 NSManagedObjectContexts, um em ProjectListViewController, e um separado em ProjectDetailViewController (eu suponho que é criado lá desde que eu não vê-lo passado.

Quando você salvar um contexto que faz mudanças não automaticamente propagar para outro, de modo salvar a um em ProjectDetailViewController não causa as mudanças apareçam no contexto de ProjectListViewController, o que significa que não há mudanças em que um para contar o delegado sobre -lo.

Se você quer empurrar as mudanças entre contextos, olhe para NSManagedObjectContextDidSaveNotification e mergeChangesFromContextDidSaveNotification: (eles são o fim do NSManagedObjectContext documentação ).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top