合并2个PublishSubject,并使用Observable.combineLatest发出

问题描述 投票:0回答:1

我在服务中有2个单独的数据集合。

FeaturedStandard内容。

我进行了2次api调用,以返回这些项目。它们可以单独使用,但是当我想同时使用两组数据,根据条件提供一些充实然后将它们返回给消费者时,我也有用例。

我希望我可以做这样的事情:


class ContentService: ContentServiceType {

    let featured = PublishSubject<[Content]>()
    let standard = PublishSubject<[Content]>()

    let content: Observable<(featured: [Content], standard: [Content])>

    private let client: Client<ContentAPI>
    private let disposeBag = DisposeBag()

    init(client: Client<ContentAPI>) {
        self.client = client

        content = Observable
            .combineLatest(featured, standard)
            .map { (featured, standard) -> (featured: [Content], standard: [Content]) in

        /*
            Do some enrichment and create then return new, updated versions
        */

                return (featured: updatedFeatured, standard: updatedStandard)
        }.share()
    }

    func fetchStandardContent(page: Int = 0, size: Int = 100) -> Single<Void> {

        let params = ["page": page, "size": size]
        let request: Single<Content> = client.request(.getStandardContent(params))

        return request.map { [unowned self] launchers in
            self.standard.onNext(content.props)
            return ()
        }
    }

    func fetchFeaturedContent(page: Int = 0, size: Int = 100) -> Single<Void> {

        let params = ["page": page, "size": size]
        let request: Single<Content> = client.request(.getFeaturedContent(params))

        return request.map { [unowned self] content in
            self.featured.onNext(content.props)
            return ()
        }
    }
 }   

然后我希望在应用程序的其他地方可以做类似的事情

        contentSvc.content
            .observeOn(MainScheduler.instance)
            .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background))
            .subscribe(onNext: { content in
               /* do something w/ content */
            }).disposed(by: disposeBag)

然后每当调用contentSvc.fetchFeaturedContentcontentSvc.fetchStandardContent时,上方的contentSvc.content用户将获得新数据。

相反,content似乎没有发出任何值。

swift rx-swift reactive-swift
1个回答
0
投票

combineLatest要求两个光源都必须先发射,然后才能发射自己。

我可能会考虑使用BehaviorSubjectBehaviorRelay代替PublishSubject。

© www.soinside.com 2019 - 2024. All rights reserved.