简体   繁体   English

如何使用RxSwift将两个observable合并到另一个observable?

[英]How to merge two observable to another observable with RxSwift?

How to merge two observable to another observable with RxSwift? 如何使用RxSwift将两个observable合并到另一个observable? In my case: 就我而言:

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
       //....
    }
}

but xcode build failed for reason: 但xcode构建失败的原因:

Cannot convert value of type '(AssetMediaType, ) -> Observable<[MediaAsset]>' to expected argument type '( , _) -> _' 无法将类型'(AssetMediaType, ) - > Observable <[MediaAsset]>'的值转换为预期的参数类型'( ,_) - > _'

If you want them to fire at the same time you need to use a Zip 如果你想要它们同时开火你需要使用Zip

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

or in your code 或者在你的代码中

struct ViewModel {

let items: Observable<[MediaAsset]>

init(type: Observable<AssetMediaType>, provider: DataProvider) {
    items = Observable.zip(type, provider.rx.didAuthorize){$0}

}

Root Issue: 根问题:

Your types are mismatched. 您的类型不匹配。

Assuming that those functions belong to DataProvider.rx, instead of ViewModel, This code: 假设这些函数属于DataProvider.rx,而不是ViewModel,这段代码:

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

returns an Observable< Observable<[ViewModel.MediaAsset]>> 返回一个Observable <Observable <[ViewModel.MediaAsset] >>

but you declared items as an Observable<[MediaAsset]> 但您将项目声明为Observable <[MediaAsset]>

Solution: Flatten the observable 解决方案:展平可观察量

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

    }

Note: It's unclear how you are using status. 注意:目前还不清楚你是如何使用状态的。 I passed it to the flatMapLatest, but it won't be passed along any further. 我将它传递给flatMapLatest,但它不会再传递给它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM