我有一个使用Core Data的iOS应用程序以及标签栏控制器。在第一个选项卡中,用户可以添加保存在Core Data中的项目。在第二个选项卡中,还有其他功能依赖于对Core Data存储的只读访问权限。当我打开应用程序并在标签之间切换时,数据看起来是一样的,但是,如果我然后在第一个标签中添加一个项目,并切换到第二个标签,它没有显示,即没有'一直在刷新。在第二个选项卡中,我最初在viewDidLoad中完成了提取,但我已将其移动到viewDidAppear中,希望每次切换到第二个选项卡时都会发生提取(并且相应的视图出现)但我还是得到了同样的问题。
在第一个标签界面中添加项目后点击第二个标签时,如何触发提取/刷新?
-(void)viewDidAppear:(BOOL)animated
{
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
/*
Replace this implementation with code to handle the error appropriately.
abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
*/
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
答案 0 :(得分:1)
您应该收听通知NSManagedObjectContextObjectsDidChangeNotification
此通知告诉您数据库中有更改。
有关这篇文章的详细解释:
答案 1 :(得分:0)
除非您手动更改查询的某个方面,否则您不需要手动执行获取:不止一次。如果查询结果发生变化,您将通过委托方法获得通知。我只是继续调用viewDidLoad,因为视图将在控制器第一次显示时被懒惰地加载,也就是说,当你通过UITabBarController按钮打开它时
如果您在演示文稿之间手动更改查询,请提供更多上下文,以便我们帮助您正确实施。
编辑:这是一个最低限度的实现,只要查询结果发生变化,它就会重新加载表视图。委托方法允许更具体的行为,如插入行或删除它们而不重新加载整个表,您可以从标题或苹果文档中读取足够的信息来实现这一点,但这将使您前进。
- (void)viewDidLoad
{
[super viewDidLoad];
[self fetch];
}
- (void)fetch
{
if (!self.resultsController) {
//Optionally create resultsController lazily here, I didn't see where you created it
}
[self.resultsController performFetch:&error];
//The manual fetch call doesn't trigger delegate calls, so you refresh manually here after the fetch.
[self.tableView reloadData];
}
#pragma mark - UITableViewDataSource
//..
//Implement the table datasource to pull from the NSFetchedResultsController here.
//..
#pragma mark - NSFetchedResultsControllerDelegate
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView reloadData];
}