You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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闭包实现逻辑

你需要完成三步操作:

  1. 用最新变更的联系人更新全量联系人列表
  2. 将所有ContactModel转换为ContactCellModel
  3. 构造符合要求的分区模型返回

注意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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 04:15:04