在选项卡之间切换时获取核心数据
Posted
技术标签:
【中文标题】在选项卡之间切换时获取核心数据【英文标题】:core data fetch when switching between tabs 【发布时间】:2014-06-10 14:11:31 【问题描述】:我有一个使用 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();
【问题讨论】:
最好的猜测是您需要设置和实现 fetchcontroller 委托方法。这几乎是您直接从参考中复制的样板代码。 【参考方案1】:你应该收听通知NSManagedObjectContextObjectsDidChangeNotification
此通知告诉您数据库中发生了更改。
为了更好的解释,请看这篇文章:
How can I track/observe all changes within a subgraph?
【讨论】:
【参考方案2】:除非您手动更改查询的某个方面,否则您不需要手动执行Fetch:不止一次。如果查询结果发生变化,您将通过委托方法收到通知。我只是保持对 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];
【讨论】:
我不明白你的回答。我在第一个选项卡的 tableViewController 中有一个 viewDidLoad,在第二个选项卡的 tablViewController 中有一个 viewDidLoad。我应该在这两个 viewDidLoad(s) 中执行提取还是只在其中一个中执行提取?无论如何,我现在都可以获取它们(以及 viewDidAppear),并且正如 OP 所述,第二个选项卡中的数据不是最新的(注意,我没有更改演示文稿之间的查询),所以委托方法需要实现吗? 如果每个控制器都有自己的获取结果控制器,每个控制器都会为自己的 NSFetchedResultsController 调用 fetch: on viewDidLoad。至于其他的东西,请稍等,我会用一些例子来编辑我的答案。以上是关于在选项卡之间切换时获取核心数据的主要内容,如果未能解决你的问题,请参考以下文章