核心数据:延迟调用 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

延迟href执行点击直到ajax调用之后

刷新表格时应用程序崩溃(可能是tableView上的调用endUpdates导致崩溃)

延迟后在后台线程中处理核心数据

tableView beginUpdates / endUpdates 阻止重新加载整个表,即使是空的