在标签之间切换时获取核心数据

时间:2014-06-10 14:11:32

标签: ios objective-c

我有一个使用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();
    }

}

2 个答案:

答案 0 :(得分:1)

您应该收听通知NSManagedObjectContextObjectsDidChangeNotification

此通知告诉您数据库中有更改。

有关这篇文章的详细解释:

How can I track/observe all changes within a subgraph?

答案 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];
}