NSFetchedResultsControllerDelegate не запускается - PullRequest
3 голосов
/ 24 августа 2009

Я не могу понять, почему при моей жизни методы NSFetchedResultsControllerDelegate не запускаются, когда я добавляю данные в базовое хранилище данных. Данные сразу отображаются, если я перезагружаю приложение iPhone.

У меня есть подкласс UITableViewController и он соответствует NSFetchedResultsControllerDelegate:

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

Я создаю экземпляр NSFetchedResultsController и устанавливаю для делегата значение self:

// 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

Ответы [ 2 ]

3 голосов
/ 24 августа 2009

Если я изменю sectionNameKeyPath с @ "Client" на nil при создании исходного fetchedResultsController_, оба объекта Project creation и save действительно вызовут методы делегата!

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

При повышенном внимании, это то, что делает пример CoreData Recipes. Поскольку мои данные становятся более сложными - я думаю, что мне понадобится этот аргумент, чтобы разбить результаты на разделы, но сейчас приятно видеть вызываемые обработчики делегатов.

1 голос
/ 24 августа 2009

Мое прочтение вышеизложенного выглядит так, как будто вы используете 2 NSManagedObjectContexts, один в ProjectListViewController, и отдельный в ProjectDetailViewController (я предполагаю, что он создан там, поскольку я не вижу его переданным.

Когда вы сохраняете один контекст, он автоматически не передает изменения в другой, поэтому сохранение его в ProjectDetailViewController не приведет к тому, что изменения появятся в контексте ProjectListViewController, что означает, что в этом контенте нет никаких изменений, о которых делегат сообщает это.

Если вы хотите отправить изменения между контекстами, посмотрите NSManagedObjectContextDidSaveNotification и mergeChangesFromContextDidSaveNotification: (они являются концом NSManagedObjectContext документация ).

).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...