使用RxSwift进行长轮询

时间:2016-08-29 20:27:57

标签: swift operators rx-java long-polling rx-swift

我想用RxSwift做一个简单的长轮询请求,它可能类似于下面的RxJava代码:

api.loadHotels(searchRequest)
    .repeatWhen(obs -> observable.delay(3, TimeUnit.SECONDS))
    .takeUntil(searchResponse -> searchResponse.isCompleted)
    .subscribe(listener::hotelListLoaded);

在RxSwift中,有一个repeatWhen运算符,它将ObservableConvertibleType作为参数,而不是将链接的Observable作为参数传递给它的闭包,这与它在RxJava中的同义词不同。

我在RxSwift中的期望:api.loadHotels(searchRequest).repeatWhen{result -> ObservableConvertibleType}所以我可以编写与RxJava代码完全相同的逻辑。但我无法做到这一点。因为它只是api.loadHotels(searchRequest).repeatWhen(ObservableConvertibleType)完全相同的事情适用于RxSwift的takeUntil运算符。

但是我也尝试过: repeatWhen operator in RxSwiftrepeatWhen substituter in RxSwift

所以我的问题是:如何在RxSwift中实现与给定的RxJava代码相同的逻辑?我是否认为RxSwift的当前repeatWhentakeUntil运算符的工作流程错误了?

1 个答案:

答案 0 :(得分:2)

这样的事情怎么样?:

let hotelRequest = api.loadHotels(searchRequest)

hotelRequest.repeatWhen {
    return hotelRequest.flatMapLatest { result in
        // now you have your chance to use `result -> ObservableConvertibleType`
    }
}