我将脚趾插入RxSwift,并想为我的常规API调用之一创建“流API”。
我的想法是进行常规调用(该调用已经使用了可观察对象,没有任何问题),并让计时器触发了此类调用,并在相同的可观察对象上发送结果,因此视图控制器可以自动更新,因此无需进行更新(后面是伪代码) :
func getLocations() -> Observable<[Location]> {
return Observable<[Location]>.create {
sink in
NSURLSession.sharedSession.rx_JSON(API.locationsRequest).map {
json in
return json.flatMap { Location($0) }
}
}
}
我希望这种情况发生(后面是伪代码):
func getLocations(interval: NSTimeInterval) -> Observable<[Location]> {
return Observable<[Location]>.create {
sink in
NSTimer(interval) {
NSURLSession.sharedSession.rx_JSON(API.locationsRequest).map {
json in
sink.onNext(json.flatMap { Location($0) })
}
}
}
}
我尝试的最后一件事是将NSTimer添加到混合中,但是我无法弄清楚如何获取对接收器的引用,并将其传递给计时器调用的方法,以实际将事件沿管道发送出去,因为计时器的处理程序必须位于独立方法上。我尝试从BlocksKit抛出块计时器扩展,但是计时器每秒触发一次,而不是按指定的间隔触发,这违背了目的。
我也读过关于Interval
操作员的信息,但是我不确定这是正确的方法。
关于如何正确解决问题的任何指示?
最终目标是仅在上一个呼叫完成(成功或失败)之后重新启动计时器。
您应该执行类似以下代码的操作:
func getLocations(interval: NSTimeInterval) -> Observable<[CLLocation]> {
return Observable<[CLLocation]>.create { observer in
let interval = 20.0
let getLocationDisposable = Observable<Int64>.interval(interval, scheduler: MainScheduler.instance)
.subscribe { (e: Event<Int64>) in
NSURLSession.sharedSession.rx_JSON(API.locationsRequest).map {
json in
observer.onNext(json.flatMap { Location($0) })
}
}
return AnonymousDisposable {
getLocationDisposable.dispose()
}
}
}
上面的代码每20秒触发API.locationsRequest并将结果发送到相同的可观察对象上,请注意,必须在处理maim可观察对象时处置Interval。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句