我无法弄清楚为什么在我的生命中,将数据添加到基础数据存储区时不触发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应用程序-但似乎找不到我所缺少的东西。有什么想法吗?

-路德

最佳答案

如果在创建原始sectionNameKeyPath时将fetchedResultsController_从@“ Client”更改为nil,则Project实体的创建和保存都将调用委托方法!

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


经过严格的审查,这就是CoreData Recipes示例的作用。随着我的数据变得越来越复杂-我认为我将需要该参数来帮助将结果分成几部分,但就目前而言,很高兴看到委托处理程序被调用。

08-27 19:22