我有一个 UITableViewController 是CoreDataTableViewController
(它是斯坦福类)的子类。这实现了一个fetchedResultsController
.
现在,在我的viewWillAppear
,我有这个:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if(!self.managedObjectContext) {
[self useManagedDocument];
}
}
managedObjectContext
如果我没有,它会初始化它,并从帮助类中获取它。在 MOC 设置器中,我初始化fetchedResultsController
:
- (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];*/
}
我评论了这个,因为它不起作用。基本上,我想做的是每次上下文更改时重新加载数据。如果我在另一个视图控制器中添加一个项目,然后返回到这个,它也应该在这种情况下重新加载。
我该如何实施?我尝试performFetch
在该委托方法中执行并输入它(我通过在内部设置断点进行检查),但performFetch
什么也没做,我的表也没有重新加载。
当我在模态 VC 中添加一个项目(我有另一个用于管理项目的项目)时,这就是我的记录器中发生的情况:
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.
当我关闭我的应用程序但不从多任务栏中退出它,然后重新打开它时,它什么也不做。没有取。好吧,如果上下文没有改变,我不希望它触发请求,但想象一下,如果用户在另一个 ViewController 中添加一个项目,然后返回我的 ItemCDTVC,它列出了所有项目。它是否会收到上下文更改通知,以便它可以调用委托方法来更新表,或者无论我的viewWillAppear
. 我目前将其设置为仅在应用加载时执行一次。