使用IGListKit时如何强制重载所有sections实现界面更新?
IGListKit 强制更新所有 Sections 实现方案
问题根源
你当前以logo名称作为模型差分的唯一判断依据,用户购买后logo的premium锁定状态变更,但logo名称未修改,因此IGListKit的差分算法会判定对应section无变化,不会触发视图更新。
可选解决方案(按推荐优先级排序)
1. 优化模型差分逻辑(最优方案,符合IGListKit设计规范)
IGListKit的差分判断分为两步:
diffIdentifier:用于区分不同的业务对象,同一个logo的diffIdentifier仍可保留为logo名称,用于标识是同一个对象- 相等性判断:用于判断同一个对象的内容是否发生变更,你需要将premium状态字段加入相等性判断逻辑
代码示例(Swift):
class LogoModel: ListDiffable { let name: String var isPremiumLocked: Bool // 标识唯一对象,用logo名称即可 func diffIdentifier() -> NSObjectProtocol { return name as NSObjectProtocol } // 相等判断加入premium状态,状态变化时会触发更新 func isEqual(toDiffableObject object: ListDiffable?) -> Bool { guard let object = object as? LogoModel else { return false } return name == object.name && isPremiumLocked == object.isPremiumLocked } }
采用该方案后,用户购买后修改对应模型的isPremiumLocked属性,调用-[IGListAdapter performUpdatesAnimated:completion:]即可自动触发对应section的更新,无需全量刷新。
2. 强制全量更新所有Sections(快速实现方案)
如果不需要做性能优化,只想快速实现全量刷新,直接调用IGListAdapter的全量刷新方法即可,该方法会跳过差分逻辑,重新加载所有sections:
- OC代码:
[self.listAdapter reloadDataWithCompletion:nil]; - Swift代码:
listAdapter.reloadData(completion: nil)
注意:该方法必须在主线程调用,避免触发UI相关崩溃。
3. 定向刷新指定Sections(折中方案)
如果你知道哪些section对应logo模型,不想全量刷新也不想修改模型差分逻辑,可以调用定向刷新方法,只刷新需要更新的logo对应的sections:
- OC代码:
[self.listAdapter reloadObjects:needUpdateLogoModels]; - Swift代码:
listAdapter.reloadObjects(needUpdateLogoModels)
内容的提问来源于stack exchange,提问作者sagarthecoder
相关产品推荐
相关产品推荐

