我很难理解 DiffableDataSource 是如何工作的。我有这样的 ViewModel
struct ViewModel: Hashable {
var id: Int
var value: String
func hash(into hasher: inout Hasher) {
hasher.combine(id)
}
}
Run Code Online (Sandbox Code Playgroud)
我有 tableView 由 cachedItems 填充,如上面的 ViewModele。当 API 响应到达时,我想添加一个新的,删除缺失的一个,刷新 tableView 中已经存在的项目的 viewModel.value 并最终订购它。除了一件事 - 重新加载物品外,一切正常。
我对 DiffableDataSource 的理解是它比较 item.hash() 以检测项目是否已经存在,如果存在,那么如果 cachedItem != apiItem,它应该重新加载。不幸的是,这不起作用,快照确实删除和插入而不是重新加载。
DiffableDataSource 应该这样做吗?
当然,我有一个解决方案 - 为了使它工作,我需要遍历 cachedItems,当新项目包含相同的 id 时,我更新 cachedItem,然后我在没有动画的情况下应用快照,然后我终于可以应用带有动画的删除/插入/订购动画。
但是这个解决方案似乎更像是一个黑客而不是一个有效的代码。有没有更清洁的方法来实现这一目标?
更新:
有代码显示问题。它应该在操场上工作。例如。items 和 newItems 包含 id == 0 的 viewModel。哈希值相同,因此 diffableDataSource 应该重新加载,因为副标题不同。但是有可见的删除/插入而不是重新加载
import UIKit
import PlaygroundSupport
class MyViewController : UIViewController {
let tableView = UITableView() …Run Code Online (Sandbox Code Playgroud)