你好,我再上传一个问题,因为上一个问题的答案很有帮助!所以我实际上是想求出Observable<[CellModel>]>
数组中有10个不同的questionId。我需要以相同的顺序获取额外的数据。最终得到Observable<[CellModel>]>
但似乎没有Observable.create
API响应得到所有混合,如果需要更长的时间,它将只返回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())