使用RxDatasources绑定UITableView数据源时combineLatest的map应返回什么?
前置检查
首先确认你的ContactsSectionModel已经遵循SectionModelType协议,常规定义参考:
struct ContactsSectionModel: SectionModelType { typealias Item = ContactCellModel var items: [ContactCellModel] init(original: ContactsSectionModel, items: [ContactCellModel]) { self = original self.items = items } init(items: [ContactCellModel]) { self.items = items } }
map闭包实现逻辑
你需要完成三步操作:
- 用最新变更的联系人更新全量联系人列表
- 将所有
ContactModel转换为ContactCellModel - 构造符合要求的分区模型返回
注意RxTableViewSectionedAnimatedDataSource要求绑定的信号输出类型为[ContactsSectionModel],需要修正你当前的返回值类型声明,完整代码如下:
Observable.combineLatest(contactsViewModel.output.contacts, self.contactViewModel.changedStatusForContact) .map { (allContacts, changedContact) -> [ContactsSectionModel] in // 遍历全量联系人,替换状态发生变更的联系人 let updatedContacts = allContacts.map { contact in guard contact.id == changedContact.id else { return contact } return changedContact } // 转换为Cell层封装模型 let cellModels = updatedContacts.map { ContactCellModel(model: $0) } // 构造分区模型返回,单分区场景直接返回包含一个分区的数组即可 return [ContactsSectionModel(items: cellModels)] } // 确保UI刷新在主线程执行 .observe(on: MainScheduler.instance) .bind(to: dataSource) .disposed(by: disposeBag)
如果你的changedStatusForContact可能为空,可增加空值兼容处理:
let updatedContacts = allContacts.map { contact in guard let changed = changedContact, contact.id == changed.id else { return contact } return changed }
内容的提问来源于stack exchange,提问作者Whirlwind
相关产品推荐
相关产品推荐

