使用 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 定期调用 API

使用 RxSwift 在网络请求后更新 SwiftUI 列表

RxSwift Observeable 不会在数据更改时更新 tableview

RxSwift - 当 UITextField 以编程方式更新时,UILabel 字段未更新

RxSwift - UICollectionView 更新后不更新

使用 RxSwift 的 UICollectionView 数据绑定 - iOS