我对RxSwift相当陌生,现在已经开始对抗以下问题两天了。
我包装了一个从API中读取部分JSON格式字符串的闭包:
func readResult() -> Observable<String> {
return Observable<String>.create { observable -> Disposable in
API.readValue() { (result: Result<String>) in
switch result {
case .success(let value): observable.onNext(value)
case .failure(let error): observable.onError(error)
}
observable.onCompleted()
}
return Disposables.create()
}
}
由于readValue
的结果只包含一大块JSON格式的字符串,我需要递归调用此方法来获取完整的字符串。因此,只有在前一个读数完成后才开始新的读数非常重要。
我尝试使用Observable.timer
和scan
累积结果,直到我能成功解码json,但使用timer
并不能保证先前的读数已完成。
我还考虑过使用concat
,但由于我事先并不知道完整JSON字符串的长度,所以我写不出这样的内容:
Observable.concat(readResult(), readResult())
如果能成功解码生成的JSON字符串,我怎样才能确保调用readResult
函数?
答案 0 :(得分:0)
原则上, .reduce()应该是工作的正确工具。
不确定为什么要从头开始构建Observable而不是使用 .from()工厂方法。
我可能会这样做(伪代码):
let subject = PublishSubject<Observable<String>>.create()
let result = subject.switchLatest().reduce { /* update result */ }
subject.onNext(
Observable.from( /* service call */ ).subscribeOn( /* some serial scheduler */ )
) // repeat as needed
<强>更新强>
在评论中查看更具体的解决方案。