如何处理嵌套的Observable字段?

问题描述 投票:0回答:1

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

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

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

在UI层面,我愿意订阅assets变量 并为每个assets执行一些自定义逻辑。这就是我被卡住的地方,因为asset对象有以下功能 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 但也有违对象的目的。

ios swift observable rx-swift
1个回答
1
投票

也许你不应该有observable的观测值,所以你可以像这样编辑AssetModel。

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

但如果不可能的话,你应该像这样组合观测值。

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)
    }
© www.soinside.com 2019 - 2024. All rights reserved.