交换机阵列中的Rxswift Async api



你好,我再上传一个问题,因为上一个问题的答案很有帮助!所以我实际上是想求出Observable<[CellModel>]>数组中有10个不同的questionId。我需要以相同的顺序获取额外的数据。最终得到Observable<[CellModel>]>但似乎没有Observable.createAPI响应得到所有混合,如果需要更长的时间,它将只返回8项而不是10项。所以我最终得到了这样的Observable<[Observable<CellModel>?]项。所以我想知道是否有任何不同的方法,我可以获取额外的数据,而不做额外的Observable。创建!非常感谢!

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)
}

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

Observable.just([1, 2, 3])
.flatMap {
Observable.zip($0.map(mapFunc))
}
func mapFunc(a: Int) -> Observable<String> {
return .just("(a)")
}

所以你从一个Observable<[Int]>开始,然后你将数组中的每个值映射到一个新的Observable<String>,从而得到一个Observable<[Observable<String>]>。通过使用zip,您可以得到有序的行为和Observable<[String]>.

同样,当你遇到这样的情况时:

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

你可以使用just,它相当于:

Observable.just(NewsTopScrollCellModel())

最新更新