代码之家  ›  专栏  ›  技术社区  ›  DesperateLearner

订阅以获取嵌套数组

  •  0
  • DesperateLearner  · 技术社区  · 6 年前

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

    class Section {
    
     var cards: [MemberCard]
    
     init(card: [MemberCard]) {
    
     }
    }
    
    class MemberCard {
      var name: String
      var address: String?
      init(name: String) {
         self.name = name
      }
    }
    

    我订阅的是Observable类型的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>] 然后回到 可观察<[部分]> ?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Maxim Volgin    6 年前

    严格来说就是这样-

    let o1: Observable<MemberCard> = ...
    let o2: Observable<Section> = omc.toList().map { Section($0) }
    let o2: Observable<[Section]> = Observable.concat(o2 /* and all others */).toList()
    

    但我不认为这是一个最佳的解决方案,至少因为在一张或多张卡无法取回的情况下没有错误处理。我更愿意在聚合的基础上与 .scan() 接线员 https://github.com/maxvol/RaspSwift

        2
  •  0
  •   Daniel T.    6 年前

    干得好:

    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的功能性质,您的 Section MemberCard 类型应该是结构或(类) let 而不是 var s) 。
    • 不要使用 String? 除非你有一个令人信服的理由来解释为什么空字符串(“”)不同于缺少的字符串(nil)。你没有理由要检查存在 每次你想看看地址是否填好了,我都很忙。(数组和字典也是如此。)

    对于此代码,请正确使用 combineLatest 这是关键。它可以变成一个 [Observable<T>] 变成一个 Observable<[T]> .在这里学习其他有趣的组合观测值的方法: https://medium.com/@danielt1263/recipes-for-combining-observables-in-rxswift-ec4f8157265f