我的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
, title
和 thumbnailImageName
字段。我如何获得这3个字段?我可以 flatMap
但也有违对象的目的。
也许你不应该有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)
}