【问题标题】:How to merge two observable to another observable with RxSwift?如何使用 RxSwift 将两个 observable 合并到另一个 observable?
【发布时间】:2017-08-04 14:16:28
【问题描述】:

如何使用 RxSwift 将两个 observable 合并到另一个 observable? 就我而言:

struct ViewModel {

let items: Observable<[MediaAsset]>

init(type: Observable<AssetMediaType>, provider: DataProvider) {
    items = Observable.combineLatest(type, provider.rx.didAuthorize, resultSelector: { (type, status)  in
        return provider.rx.fetchMedia(type)
    })
}

public var didAuthorize: Observable<AuthorizeResult> {
    return Observable.create { o in
       //....
    }
}

public func fetchMedia(_ withType: AssetMediaType) -> Observable<[MediaAsset]> {
    return Observable.create { observer in
       //....
    }
}

但是 xcode 构建失败的原因:

无法将类型 '(AssetMediaType, ) -> Observable' 的值转换为预期的参数类型 '(, _) -> _'

【问题讨论】:

    标签: ios swift rx-swift


    【解决方案1】:

    根本问题:

    您的类型不匹配。

    假设那些函数属于DataProvider.rx,而不是ViewModel,这段代码:

    Observable.combineLatest(type, provider.rx.didAuthorize, resultSelector: { (type, status)  in
        return provider.rx.fetchMedia(type)
    })
    

    返回一个 Observable>

    但您将项目声明为 Observable

    解决方案:将 observable 展平

    items = Observable.combineLatest(type, provider.didAuthorize) { type,status in
            return (type,status)
        }
        .flatMapLatest { type,status in
            return provider.fetchMedia(type)
                
        }
    

    注意:目前尚不清楚您是如何使用状态的。我把它传给了 flatMapLatest,但它不会再传下去了。

    【讨论】:

      【解决方案2】:

      如果您希望它们同时触发,则需要使用 Zip

      let zipped = Observalbe.zip(a, b){$0}
      

      或在您的代码中

      struct ViewModel {
      
      let items: Observable<[MediaAsset]>
      
      init(type: Observable<AssetMediaType>, provider: DataProvider) {
          items = Observable.zip(type, provider.rx.didAuthorize){$0}
      
      }
      

      【讨论】:

      • 数据源是从 provider.rx.fetchMedia 获取的,定义如下
      猜你喜欢
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-29
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      相关资源
      最近更新 更多