使用 RxSwift 创建“反应式”API
Posted
技术标签:
【中文标题】使用 RxSwift 创建“反应式”API【英文标题】:Creating a "reactive" API with RxSwift 【发布时间】:2016-01-24 03:20:31 【问题描述】:我正在尝试使用 RxSwift,并希望为我的一个常规 API 调用创建一个“流式 API”。
我的想法是进行常规调用(它已经使用了 observables 而没有任何问题)并有一个计时器触发此类调用并将结果发送到同一个 observable 上,因此视图控制器可以自动更新,所以不要这样做(伪代码如下):
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
运算符的信息,但我不确定这是正确的方法。
关于如何做到这一点的任何指示?
最终目标是仅在上一次调用完成(成功或失败)后重新触发计时器。
【问题讨论】:
【参考方案1】:您应该执行以下代码:
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 并在同一个 observable 上发送结果,请注意你必须在 maim observable dispose 时释放 Interval。
【讨论】:
以上是关于使用 RxSwift 创建“反应式”API的主要内容,如果未能解决你的问题,请参考以下文章
Swft3 (RxSwift, RxCocoa) - TableView 使用响应式编程展开和折叠概念
将 UIApplicationDelegate 方法转换为 RxSwift Observables