开关数组中的 Rxswift Async api

Posted

技术标签:

【中文标题】开关数组中的 Rxswift Async api【英文标题】:Rxswift Async api in switch array 【发布时间】:2021-07-26 06:15:45 【问题描述】:

您好,我正在上传另一个问题,因为上一个问题的答案非常有帮助! 所以我真的想得到Observable<[CellModel>]> 数组中有 10 个不同的 questionId。 我需要以相同的顺序获取额外的数据。 结果我最终想要Observable<[CellModel>]> 但似乎没有Observable.create api 响应混合在一起,如果需要更长的时间,它将只返回 8 个项目而不是 10 个项目。 所以我最终得到了 Observable<[Observable<CellModel>?]like 这个项目。 所以我想知道是否有任何不同的方式可以在不制作额外 Observable.create 的情况下获取额外数据! 非常感谢!

    private func request(categoryId: Int?) -> Observable<[Observable<CellModel>?]> 
            return .create  obs -> Disposable in
                self.requestAuthData(categoryId: categoryId)
                    .trackError(self.errorTracker)
                    .debug()
                    .subscribe(onNext:  [weak self] model  in
                        guard let self = self else  return 
                        var cells: [Observable<CellModel>] = model.items.questions.map 
                            switch $0.cardType 
                            case .open:
                                if $0.type.isEssay 
                                    let info = $0
                                    return  Observable.create  [weak self] observer in
                                        self?.requestEssayData(question_id: info.id, info, completion:  (cellmodel) in
                                            observer.onNext(cellmodel)
                                            observer.onCompleted()
                                        )
                                        return Disposables.create()
                                    
                                 else 
                                    let info = $0
                                    return  Observable.create  [weak self] observer in
                                        self?.requestMutipleAnswerData(question_id: info.id, info, completion:  (cellmodel) in
                                            observer.onNext(cellmodel)
                                            observer.onCompleted()
                                        )
                                        return Disposables.create()
                                    
                                
                            case .blind, .sample, .not_confirmed, .please_sign_in:
                                let info = $0
                                return  Observable.create  [weak self] observer in
                                    self?.requestMutipleAnswerData(question_id: info.id, info, completion:  (cellmodel) in
                                        observer.onNext(cellmodel)
                                        observer.onCompleted()
                                    )
                                    return Disposables.create()
                                
                            
                        
                        cells.append( Observable.create  [weak self] observer in
                            observer.onNext( NewsTopScrollCellModel())
                            observer.onCompleted()
                            return Disposables.create()
                        )
                        obs.onNext(cells)
                        obs.onCompleted()
                    )
                return Disposables.create()
            
        



 private func requestEssayData(question_id: Int, _ item: QuestionInfo,  completion: @escaping (CellModel) -> Void) 
        let info = item
        Observable.zip(self.requestDetailData(question_id), self.requestTagData(question_id))
            .trackError(self.errorTracker)
            .share()
            .subscribe(onNext:  [weak self] essay, tag in
                guard let self = self else  return 
                let noData: Bool = essay.items.totalCount == 0
                guard !noData else 
                    return  completion(EmptyCellViewModel(spacing: 0.5)) 
                completion(PremiumReviewEssayCellModel(item, companyID: self.companyID, essay: essay, tag: tag, delegate: self))
            )
            .disposed(by: self.disposeBag)
    

private func requestDetailData(_ question_id: Int) -> Observable<EssayModel> 
    let params: [String: Any] = ["company_id": companyID, "question_id": question_id, "type": "text"]
    return Network
        .request("/apiapi~~~mightbe important1", parameters: params)
        .expectType(EssayModel.self)


private func  requestTagData(_ question_id: Int) -> Observable<TagData> 
    let params: [String: Any] = ["company_id": companyID, "question_id": question_id]
    return Network
        .request("/apiapi~~~mightbe important2", parameters: params)
        .expectType(TagData.self)

【问题讨论】:

【参考方案1】:

如果我正确理解了这个问题,您想要的简化版本类似于:

Observable.just([1, 2, 3])
  .flatMap 
    Observable.zip($0.map(mapFunc))
  

func mapFunc(a: Int) -> Observable<String> 
  return .just("\(a)")

因此,您从Observable&lt;[Int]&gt; 开始,然后将数组中的每个值映射到新的Observable&lt;String&gt;,从而得到Observable&lt;[Observable&lt;String&gt;]&gt;。通过使用zip,您可以获得有序行为和Observable&lt;[String]&gt;

另外,当你遇到这种情况时:

Observable.create  [weak self] observer in
    observer.onNext(NewsTopScrollCellModel())
    observer.onCompleted()
    return Disposables.create()

您可以使用 just 等效:

Observable.just(NewsTopScrollCellModel())

【讨论】:

这是一个很好的答案,只是它不需要是concat,它将序列化请求。您可以改用zip,它会同时启动所有请求,但要让它们按数组顺序排列。 非常感谢法比奥,丹尼尔!我从这些答案中学到了很多东西!

以上是关于开关数组中的 Rxswift Async api的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift之UI控件UISwitch与UISegmentedControl扩展的使用

RxSwift:UISwitch 切换回初始状态

我应该如何访问有关用于使用RxSwift和MVVM填充表格视图的数组的数据

如何使用 RxSwift 订阅数组更改?

RxSwift 将可观察对象数组与对象数组结合

RxSwift 观察数组的变化