使用 RxSwift 定期更新
Updating periodically with RxSwift
我使用以下设置从 API 检索对象(例如 GitHub 问题)。这很好用。
let provider: RxMoyaProvider<GitHub>
let issues: Driver<[IssueViewModel]>
init(provider: RxMoyaProvider<GitHub>) {
self.provider = provider
issues = provider.request(.Issue)
.mapArray(Issue.self, keyPath: "issues")
.asDriver(onErrorJustReturn: [])
.map { (models: [Issue]) -> [IssueViewModel] in
let items = models.map {
IssueViewModel(name: [=10=].name,
description: [=10=].description
)
}
return items
}
}
现在我想定期更新问题列表(例如,每 20 秒)。我想过 NSTimer
来完成这个任务,但我想可能有一个我没有想到的干净(呃)解决方案(即以 Rx 方式)。
非常感谢任何正确方向的提示。
您可能正在寻找 interval
操作员。
这是 interval
的循环示例,它将每秒打印 "test" 。
Link 到文档:http://reactivex.io/documentation/operators/interval.html
var driver: Driver<String> {
return Driver<Int>.interval(1.0).map { _ in
return "test"
}
}
driver.asObservable().subscribeNext { (variable) in
print(variable)
}
这与 非常相似。
你应该使用 timer
然后 flatMapLatest
:
Observable<Int>.timer(0, period: 20, scheduler: MainScheduler.instance)
.flatMapLatest { _ in
provider.request(.Issue)
}
.mapArray(Issue.self, keyPath: "issues")
// ...
我使用以下设置从 API 检索对象(例如 GitHub 问题)。这很好用。
let provider: RxMoyaProvider<GitHub>
let issues: Driver<[IssueViewModel]>
init(provider: RxMoyaProvider<GitHub>) {
self.provider = provider
issues = provider.request(.Issue)
.mapArray(Issue.self, keyPath: "issues")
.asDriver(onErrorJustReturn: [])
.map { (models: [Issue]) -> [IssueViewModel] in
let items = models.map {
IssueViewModel(name: [=10=].name,
description: [=10=].description
)
}
return items
}
}
现在我想定期更新问题列表(例如,每 20 秒)。我想过 NSTimer
来完成这个任务,但我想可能有一个我没有想到的干净(呃)解决方案(即以 Rx 方式)。
非常感谢任何正确方向的提示。
您可能正在寻找 interval
操作员。
这是 interval
的循环示例,它将每秒打印 "test" 。
Link 到文档:http://reactivex.io/documentation/operators/interval.html
var driver: Driver<String> {
return Driver<Int>.interval(1.0).map { _ in
return "test"
}
}
driver.asObservable().subscribeNext { (variable) in
print(variable)
}
这与
你应该使用 timer
然后 flatMapLatest
:
Observable<Int>.timer(0, period: 20, scheduler: MainScheduler.instance)
.flatMapLatest { _ in
provider.request(.Issue)
}
.mapArray(Issue.self, keyPath: "issues")
// ...