【问题标题】:How to deal with nested Observable fields?如何处理嵌套的 Observable 字段?
【发布时间】:2020-05-13 13:41:02
【问题描述】:

我的 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
    }
})

我将执行的自定义逻辑同时需要ordertitlethumbnailImageName 字段。我如何获得所有这 3 个字段?我可以分别flatMap他们,但也违背了对象的目的。

【问题讨论】:

    标签: ios swift observable rx-swift


    【解决方案1】:

    可能你不应该有 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)
        }
    

    【讨论】:

    • 谢谢!这也是我的想法,很高兴看到其他人有同样的想法。它看起来很丑,你可能是对的,首先我不应该有一个可观察的可观察对象。让我检查一下数据模型是否可以更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2019-01-23
    相关资源
    最近更新 更多