核心数据:延迟调用 endUpdates 直到 viewWillAppear
Posted
技术标签:
【中文标题】核心数据:延迟调用 endUpdates 直到 viewWillAppear【英文标题】:Core Data: delay calling endUpdates till viewWillAppear 【发布时间】:2011-07-07 19:40:05 【问题描述】:我有一个带有标签栏控制器的 Core Data 应用程序,它显示 2 个视图控制器。如果我在第一个选项卡的视图控制器中添加一些东西,它应该显示在第二个选项卡的 VC 中。两个 VC 都基于基于同一实体的 NSFetchedResultsController;唯一的区别是一个有谓词而第二个 VC 没有。
这适用于普通模板,当从第一个 VC 添加数据时,它会在第二个选项卡中使用 controllerWillChangeContent 和 controllerDidChangeContent 立即更新。问题是,如果用户在第一个 VC 中添加或删除任何行,当用户来到第二个选项卡时,他们看不到动态插入或删除的行......一切都已经存在了。
在第二个选项卡的 VC 中,我想做的是延迟调用 [self.tableView endUpdates](这会导致表中的行的动画插入/删除),直到用户实际转到该选项卡,在那个VC的viewWillAppear。我试过了,但似乎不起作用:
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
tableviewUpdates = TRUE;
- (void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
if (tableviewUpdates)
tableviewUpdates = FALSE;
[self.tableView endUpdates];
如果一次添加一行然后切换到第二个选项卡,则此方法有效,但如果我在第一个选项卡中添加多行然后切换,则无效。 任何帮助,将不胜感激。
【问题讨论】:
【参考方案1】:您正在违背 NSFetchedResultsController 的目的,即自动且轻松地更新 tableview。
但是,我很确定,如果您覆盖所有 FRC 委托方法,您可以阻止所有自动更新。
您可能需要重新考虑此设计。用户真的会期望看到一个视图的变化在一秒钟内重新制定吗?他们会明白他们正在观看之前更改的回放,还是会直觉地认为该应用程序正在对他们的数据做一些事情?
标准的 UI 语法让用户期望一个更改会产生一次动画,然后会在标准显示中显示出来。我建议你在部署这样一个非标准接口之前,用天真的用户仔细测试这个设计。
【讨论】:
感谢您的反馈。我不知道......我觉得如果用户在 VC1 中进行了一堆更改,然后转到 VC2,他们就会失去这些更改发生位置的所有上下文。由于它是基于日期的,所有更改都可以在 VC2 中交错,如果它没有动画,他们将不会看到他们最近的更改,因为它们适合列表。使用动画,更容易为用户提供上下文。 您的决定可能有正当理由,但请小心。我能想到的一个问题是,如果用户在 VC1 中进行大量更改,当他们切换到 VC2 时,他们将不得不等待动画完成才能执行任何操作。在我的用户测试中,用户注意到任何超过 2 秒的延迟,并开始认为应用程序运行缓慢甚至挂起 5 秒。为了有用,您必须让动画运行得足够慢,以便用户可以跟踪它们,但如果动画有很多变化,这将变得乏味。以上是关于核心数据:延迟调用 endUpdates 直到 viewWillAppear的主要内容,如果未能解决你的问题,请参考以下文章
endUpdates 后的 UITableView 部分页脚视图位置
IOS Swift Master Detail Application, managed object, tableView: endUpdates() 调用configureCell() 但崩溃,r