使用 RxSwift 定期更新
Posted
技术标签:
【中文标题】使用 RxSwift 定期更新【英文标题】:Updating periodically with RxSwift 【发布时间】:2016-09-06 19:46:48 【问题描述】:我使用以下设置从 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: $0.name,
description: $0.description
)
return items
现在我想定期更新问题列表(例如,每 20 秒)。我想过一个 NSTimer
来完成这项任务,但我想可能有一个我没有想到的干净(er)解决方案(即以 Rx 方式)。
高度赞赏任何正确方向的提示。
【问题讨论】:
【参考方案1】:这与this question/answer非常相似。
您应该使用timer
,然后使用flatMapLatest
:
Observable<Int>.timer(0, period: 20, scheduler: MainScheduler.instance)
.flatMapLatest _ in
provider.request(.Issue)
.mapArray(Issue.self, keyPath: "issues")
// ...
【讨论】:
这太好了,谢谢!鉴于.Issue 需要一个参数(例如.Issue(id: issueId)
),如何在flatMapLatest
中引用它(issueId
是一个存储属性)?
在块中使用.flatMapLatest [weak self] _ in
,然后使用self?.issueId
。
来自未来的你好!如果您想按顺序处理请求,您可能希望使用concatMap
。【参考方案2】:
您可能正在寻找interval
运算符。
这是interval
的循环示例,它将保持每秒打印“测试”。
文档链接: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)
【讨论】:
感谢您的回答。但是如何将其应用于Driver
?
看起来间隔也适用于Drivers
。我已经更新了之前的例子
很好,但是如何将其应用到我的具体示例中?以上是关于使用 RxSwift 定期更新的主要内容,如果未能解决你的问题,请参考以下文章
使用 RxSwift 在网络请求后更新 SwiftUI 列表
RxSwift Observeable 不会在数据更改时更新 tableview
RxSwift - 当 UITextField 以编程方式更新时,UILabel 字段未更新