Ios 创建一个;反应性;带有RxSwift的API
我正在深入研究RxSwift,并希望为我的一个常规API调用创建一个“流式API” 我的想法是进行常规调用(已经使用了observable,没有任何问题),让计时器触发此类调用并发送相同observable的结果,这样视图控制器可以自动更新,而不是这样做(伪代码如下):Ios 创建一个;反应性;带有RxSwift的API,ios,swift,nstimer,rx-swift,Ios,Swift,Nstimer,Rx Swift,我正在深入研究RxSwift,并希望为我的一个常规API调用创建一个“流式API” 我的想法是进行常规调用(已经使用了observable,没有任何问题),让计时器触发此类调用并发送相同observable的结果,这样视图控制器可以自动更新,而不是这样做(伪代码如下): func getLocations()->可观察{ 返回可观察的。创建{ 陷入 NSURLSession.sharedSession.rx_JSON(API.locationsRequest.map){ 中的json 返回jso
func getLocations()->可观察{
返回可观察的。创建{
陷入
NSURLSession.sharedSession.rx_JSON(API.locationsRequest.map){
中的json
返回json.flatMap{Location($0)}
}
}
}
我希望发生这种情况(伪代码如下):
func getLocations(间隔:NSTimeInterval)->可观察{
返回可观察的。创建{
陷入
NSTimer(间隔){
NSURLSession.sharedSession.rx_JSON(API.locationsRequest.map){
中的json
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()
}
}
}
func getLocations(间隔:NSTimeInterval)->可观察{
返回可观察的。在中创建{observer
设间隔=20.0
让getLocationDisposable=Observable.interval(interval,调度器:MainScheduler.instance)
.订阅{(e:事件)中的
NSURLSession.sharedSession.rx_JSON(API.locationsRequest.map){
中的json
observer.onNext(json.flatMap{Location($0)})
}
}
一次性退货{
getLocationDispose.dispose()
}
}
}
上面的代码每20秒触发一次API.locationsRequest,并在同一个可观察对象上发送结果,请注意,您必须处理maim可观察对象处理时的间隔
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) })
}
}
}
}
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()
}
}
}