【问题标题】:Using KVO to update table cells from model upon any change to model对模型进行任何更改时,使用 KVO 从模型更新表格单元格
【发布时间】:2021-08-28 02:00:06
【问题描述】:

我可能有多个从同一模型更新的表格单元格。我希望能够在模型更改时更新所有这些。所以我假设我会使用 KVO 来做到这一点。我的问题是,我怎样才能让每个人对模型的任何更改做出反应,而不仅仅是每个单元格将显示的部分?即,如果模型中的一项发生更改,我希望所有单元格都自行更新。

【问题讨论】:

    标签: ios uitableview model uikit key-value-observing


    【解决方案1】:

    尝试在更改模型后立即使用 tableView.reloadData()。另一方面,您也可以尝试使用 RxSwift 并将您的模型项绑定到 tableView - 然后,每当模型更改时,您的 tableview 将重新加载。参考这些文章作为 RxSwift 与 tableView 一起使用的简单示例: http://rx-marin.com/post/bind-multiple-cells/ https://daddycoding.com/2020/04/20/rxswift-uitableview-with-section/

    【讨论】:

      【解决方案2】:

      所以我假设我会使用 KVO 来做到这一点。

      表格单元格是非常短暂的 - 表格中给定行的单元格几乎会在它滚出屏幕时被重新用于不同的行。所以长期关系真的不是细胞擅长的事情,你可能不想去设置一个细胞来直接观察你的模型的一部分。相反,让视图控制器担心模型并在模型更改时重新加载任何受影响的单元格。如果你想使用键值观察让视图控制器观察模型,那可以正常工作。

      我的问题是,我如何让每个人对模型的任何更改做出反应,而不仅仅是每个单元格将显示的部分?

      当视图控制器得知模型已经改变时,它应该告诉表重新加载它的数据。此时,表格将经历重新创建可见单元格的过程,其效果将是所有单元格都将出现“自我更新”。

      【讨论】:

      • 这些单元格会停留一段时间。确实,用户可以滚动。但是最小化对可能有 1000 个项目的整个表的更新似乎应该是优先事项。该应用程序基本上是一个社交应用程序,因此模型的更新会很频繁,并且用户的注意力会在一段时间内集中在一些可以最大限度地减少滚动。
      • 这不是它的工作原理。该表可能有 1000 行,但不会有近 1000 个单元格。当您reloadData 时,表格视图只会要求其数据源重新创建可见行的单元格。如果您遵循正常模式,直到有实际理由不这样做,您的生活会轻松很多。
      • 是的,我知道。但是,每次只需要更新一行时重新加载表是非常低效的。如果这真的是它的工作原理,那么这对 Apple 来说是一个糟糕的设计。
      • 创建新视图非常昂贵。重新配置它们并没有那么多。关键是要避免不断创建和破坏视图的成本。我并不是说你不能从单元格中使用 KVO,但是当单元格改变身份时,你会不断地添加和删除观察者,这也可能很昂贵。在正常模式中,控制器只是更改少数单元格中的数据,仅此而已。如果从模型中获取数据的成本很高,那么 KVO 也会遇到同样的问题。
      【解决方案3】:

      请在数据更改后尝试使用tableView.reloadData()重新加载表格。

      【讨论】:

      • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
      • @Rob 抱歉,我编辑了答案。请检查并告诉我它是否仍然不好。
      猜你喜欢
      • 2018-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 2022-12-01
      • 2018-06-30
      • 1970-01-01
      相关资源
      最近更新 更多