更改快照 animatedDifferences 值时如何处理不一致的行为?

How to deal with inconsistent behavior when change snapshot animatedDifferences value?

我将从解释事情应该如何运作开始:

我有带组合布局和可区分数据源的集合视图。

单元格代表任务,用户可以点击并设置为今天完成, 单元格具有不同的外观,具体取决于它是否设置为完成,单元格检查 CoreData 以确定它是否完成。

现在我尝试实现一个想法,即一天完成的任务位于视图的底部,因此在顶部只有那些仍然需要完成的任务。为此,我为获取请求设置了排序描述符。

直到那一刻一切都按预期工作,但我想让这个单元格向下移动动画,所以我改变了 dataSource.apply(snapshot, animatingDifferences: false)true

现在它是动画的,但设置完成后单元格不会改变外观。

这是我的 setupSnapshot 方法 ():

func setupSnapshot() {
    snapshot = NSDiffableDataSourceSnapshot<Section, Task>()
    snapshot.appendSections([.main])
    snapshot.appendItems(fetchedResultsController.fetchedObjects ?? [])
    dataSource.apply(snapshot, animatingDifferences: true)   
}

看看:动画差异:false(左)和 true(右)

总而言之,我的目标是:

1) 动画单元格和 2) 在设置为完成时更改了外观。 似乎 animatingDifferences: false 我只能有 目标 2animatingDifferences: true 只能有 目标 1

我已经尝试研究这个主题并发现了一些关于两次应用快照的东西,一次用于部分,一次用于项目,但它没有任何区别。

谁能指出我在这里遗漏了什么?

经过进一步调查并根据此处的评论:

当其参数 animatingDifferences 具有不同的值时,apply(snapshot: animatingDifferences:) 中的行为有所不同。

似乎 animatingDifferences: false 在幕后进行了 reloadData(),而 animatingDifferences: true 并没有发生,至少根据这些评论及其与我的经验一致。

因此我的代码的解决方案是将 setupSnapshot 调整为:

func setupSnapshot(animated: Bool) {
      snapshot = NSDiffableDataSourceSnapshot<Section, Task>()
      snapshot.appendSections([.main])
      snapshot.appendItems(fetchedResultsController.fetchedObjects ?? [])   
      dataSource.apply(snapshot, animatingDifferences: animated) {
         if animated {
            self.collectionView.reloadData()
         }
      }
}