0

我的服务中有 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.fetchFeaturedContentor ,上面的订阅者都会获取新数据。contentSvc.fetchStandardContentcontentSvc.content

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

4

2 回答 2

2

combineLatest我相信它需要两个来源都发射,然后它才会自行发射。

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

于 2019-10-21T14:39:25.667 回答
0

我使用的是 BehaviorRelay 而不是 PublishSubject,因为当从多个流绑定到 PublishSubject(跨应用程序共享)时,如果这些流中的任何一个发送完整,则 PublishSubject 可能会终止。中继类永远不会产生错误或永远不会完成。

let featured = BehaviorRelay(value: [Content]())
let standard = BehaviorRelay(value: [Content]())

func getContent() -> Observable<(featured: [Content], standard: [Content])> {
     return Observable
       .combineLatest(
         featured.asObservable(),
         standard.asObservable(),
         resultSelector: { (featured, standard) -> (featured: [Content], standard: [Content]) in
           return (featured: featured, standard: standard)
       }
     )
  }

func addElemToFeatured() {
    featured.accept([Content(name: "abc")])
  }

  func addElemToStandard() {
    standard.accept([Content(name: "xyz")])
  }

在初始化方法中从不同的类调用 getContent() 方法。还可以从不同的地方调用 addElemToFeatured、addElemToStandard,例如按钮操作。

listener!.getContent()
      .subscribe(onNext: { (featured, standard) in
        print(featured)
        print(standard)
      }).disposed(by: disposeBag)
于 2019-10-24T10:23:26.327 回答