首页 > 解决方案 > 如何处理嵌套的 Observable 字段?

问题描述

我的 Swift 代码中确实有以下视图模型对象:

class AssetModel {    
  var assetOrder: Observable<Int>
  var title: Observable<String?>
  var thumbnailImageName: Observable<String?>
}

class SectionModel {    
  var assets: Observable<[AssetModel]>
}

在 UI 级别,我愿意订阅 assets 变量并为每个资产执行一些自定义逻辑。这就是我卡住的地方,因为资产对象有Observable字段,我不知道如何处理这些嵌套字段。这是我正在做的事情:

sectionModel.assets.subscribe(onNext: { assets in 
    assets.forEach { asset in
        asset.assetOrder.subscribe(onNext: { order in }) // another subscribe here looks very odd
    }
})

我将执行的自定义逻辑同时需要order,titlethumbnailImageName字段。我如何获得所有这 3 个字段?我可以flatMap将它们分开但也正在破坏一个对象的目的。

标签: iosswiftobservablerx-swift

解决方案


可能你不应该有 observable 的 observable,所以你可以像这样编辑 AssetModel:

class AssetModel {    
    var assetOrder: Int
    var title: String?
    var thumbnailImageName: String?
}

但如果不可能,你应该像这样组合 observables:

typealias AssetTuple = (assetOrder: Int, title: String?, thumbnailImageName: String?)
sectionModel.assets
    .flatMapLatest { asset -> Observable<AssetTuple> in
        let observables = asset.map {
            Observable.combineLatest(
                $0.assetOrder,
                $0.title,
                $0.thumbnailImageName
            ) { AssetTuple($0, $1, $2) }
        }
        return Observable.merge(observables)
    }

或者

typealias AssetTuple = (assetOrder: Int, title: String?, thumbnailImageName: String?)
sectionModel.assets
    .flatMapLatest { asset -> Observable<[AssetTuple]> in
        let observables = asset.map {
            Observable.combineLatest(
                $0.assetOrder,
                $0.title,
                $0.thumbnailImageName
            ) { AssetTuple($0, $1, $2) }
        }
        return Observable.combineLatest(observables)
    }

推荐阅读