每次上下文更改时重新加载UITableView数据?

时间:2013-05-10 21:46:38

标签: ios core-data uitableview nsfetchedresultscontroller nsmanagedobjectcontext

我有一个UITableViewController,它是CoreDataTableViewController的子类(它是Stanford class)。这实现了fetchedResultsController

现在,在我的viewWillAppear中,我有这个:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    if(!self.managedObjectContext) {
        [self useManagedDocument];
    }
}

如果我没有managedObjectContext,则初始化fetchedResultsController,并从辅助类中获取它。在MOC设置器中,我初始化- (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; } }

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    /*NSError *error;
    [controller performFetch:&error];
    if(error) {
        NSLog(@"%@", error);
    }
    [self.tableView reloadData];*/
}

当我的程序启动时,它正确加载表数据,我的调试器说有一个提取请求。但是,在将数据插入到我的Core Data图表并保存之后,它表示上下文会更改并触发此委托方法:

performFetch

我对此进行了评论,因为它不起作用。基本上,我想要做的是每次上下文改变时重新加载数据。如果我在另一个视图控制器中添加一个项目,然后再回到这个项目,那么它也应该重新加载。

我该如何实现?我尝试在该委托方法中执行performFetch并输入它(我通过在内部设置断点来检查),但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. 没有做任何事情,我的表没有重新加载。

当我在模态VC中添加项目(我管理项目的另一个项目)时,这就是我的记录器中发生的事情:

viewWillAppear

当我关闭我的应用程序但不从多任务栏退出,然后重新打开它时,它什么都不做。没有取。好吧,如果上下文没有改变,我不希望它发出请求,但想象一下,如果用户在另一个ViewController中添加一个项目,然后返回我的ItemCDTVC,列出所有项目。它是否获得上下文更改通知,以便它可以调用委托方法来更新表,或者无论{{1}}中的更改如何,我是否总是必须刷新?我目前已将其设置为仅在app app上执行一次。

1 个答案:

答案 0 :(得分:0)

修正了,我所要做的就是在该委托方法中添加一个班轮:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView endUpdates];
}

这将结束对表的更新,插入,删除和更改(基本上刷新我的视图)与Apple's documentation相同。

现在更新内容更改。