RxSwift - 重复可观察直到谓词

时间:2018-01-12 14:03:45

标签: swift rx-swift

我对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.timerscan累积结果,直到我能成功解码json,但使用timer并不能保证先前的读数已完成。

我还考虑过使用concat,但由于我事先并不知道完整JSON字符串的长度,所以我写不出这样的内容:

Observable.concat(readResult(), readResult())

如果能成功解码生成的JSON字符串,我怎样才能确保调用readResult函数?

1 个答案:

答案 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

<强>更新

在评论中查看更具体的解决方案。