我有一个对象及其属性,如下所示:
class Section {
var cards: [MemberCard]
init(card: [MemberCard]) {
}
}
class MemberCard {
var name: String
var address: String?
init(name: String) {
self.name = name
}
}
我正在订阅Observable <[Section]>类型的RxStream。在我订阅之前,我想要平面映射此功能。
平面地图将执行以下操作:
let sectionsStream : Observable<[Section]> = Observable.just([sections])
sectionsStream
.flatMap { [weak self] (sections) -> Observable<[Section]> in
for section in sections {
for card in section.cards {
}
}
}.subscribe(onNext: { [weak self] (sections) in
self?.updateUI(memberSections: sections)
}).disposed(by: disposeBag)
func getAddressFromCache(card: MemberCard) -> Observable<MemberCard> {
return Cache(id: card.name).flatMap ({ (card) -> Observable<MemberCard> in
asyncCall{
return Observable.just(card)
}
}
}
将Observable<[Section]>
转换为[Observable<MemberCard>]
的数组再转换回Observable<[Section]>
时,平面图看起来如何?
答案 0 :(得分:0)
从技术上讲-
let o1: Observable<MemberCard> = ...
let o2: Observable<Section> = omc.toList().map { Section($0) }
let o2: Observable<[Section]> = Observable.concat(o2 /* and all others */).toList()
但我认为这不是最佳解决方案,至少是因为在无法检索一张或多张卡的情况下没有错误处理。我宁愿像https://github.com/maxvol/RaspSwift那样使用.scan()
运算符围绕聚合构建一些东西
答案 1 :(得分:0)
您在这里:
extension ObservableType where E == [Section] {
func addressedCards() -> Observable<[Section]> {
return flatMap {
Observable.combineLatest($0.map { getAddresses($0.cards) })
}
.map {
$0.map { Section(cards: $0) }
}
}
}
func getAddresses(_ cards: [MemberCard]) -> Observable<[MemberCard]> {
return Observable.combineLatest(cards
.map {
getAddressFromCache(card: $0)
.catchErrorJustReturn($0)
})
}
如果其中一个缓存发出错误,则上面的内容将不变地返回MemberCard。
我还有其他一些技巧。
Section
和MemberCard
类型应为struct或(具有let
而不是var
的类)。 / li>
String?
。完全没有理由每次您要查看地址是否已填写时都必须检查存在和 isEmpty。(数组和字典也是如此。)对于此代码,正确使用combineLatest
是关键。它可以将[Observable<T>]
变成Observable<[T]>
。在此处了解结合Observables的其他有趣方式:https://medium.com/@danielt1263/recipes-for-combining-observables-in-rxswift-ec4f8157265f