ios - 如何处理嵌套的 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
,title
和thumbnailImageName
字段。我如何获得所有这 3 个字段?我可以flatMap
将它们分开但也正在破坏一个对象的目的。
解决方案
可能你不应该有 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)
}
推荐阅读
- haskell - 如何在 Haskell 中以多态方式为多种类型编写多个函数定义?
- r - 循环 data.frame 列以在 R 中生成虚拟变量
- gdb - 使用 QEMU 和 GDB 调试 xv6:无法解析名称:提供节点名或服务名,或未知
- installshield - 我如何(以编程方式)知道 Installshield 安装程序何时静默运行?
- javascript - 获取请求未在控制台或前端返回任何数据
- c# - 基于相似性对一组字符串进行聚类,同时优化冗余
- azure - HTTP 触发 Azure 函数上的 Singleton scopeId 支持的绑定
- spring - 如何将此多部分文件上传迁移到 Spring Boot 2.4?
- reactjs - 渲染对象数组
- c# - Windows 窗体中的向上和向下箭头按钮 C# Visual Studio 2019