订阅以获取嵌套数组

时间:2018-12-14 02:03:14

标签: swift rx-swift

我有一个对象及其属性,如下所示:

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]>时,平面图看起来如何?

2 个答案:

答案 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。

我还有其他一些技巧。

  • 与Rx的功能性质保持一致,您的SectionMemberCard类型应为struct或(具有let而不是var的类)。 / li>
  • 除非有充分的理由说明空字符串(“”)与缺少的字符串(nil)不同,否则不要使用String?。完全没有理由每次您要查看地址是否已填写时都必须检查存在 isEmpty。(数组和字典也是如此。)

对于此代码,正确使用combineLatest是关键。它可以将[Observable<T>]变成Observable<[T]>。在此处了解结合Observables的其他有趣方式:https://medium.com/@danielt1263/recipes-for-combining-observables-in-rxswift-ec4f8157265f