2016-09-06 46 views
2

我使用以下設置從API中檢索對象(例如GitHub問題)。這工作正常。現在使用RxSwift定期更新

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來完成這項任務,但我想可能有一個我沒有考慮的乾淨(呃)解決方案(即以Rx方式)。

任何暗示正確的方向是高度讚賞。

回答

6

這是非常相似的this question/answer

您應該使用timer然後flatMapLatest

Observable<Int>.timer(0, period: 20, scheduler: MainScheduler.instance) 
    .flatMapLatest { _ in 
     provider.request(.Issue) 
    } 
    .mapArray(Issue.self, keyPath: "issues") 
    // ... 
+0

這太好了,謝謝!鑑於.Issue需要一個參數(例如'.Issue(id:issueId)'),如何在'flatMapLatest'中引用這個參數('issueId'是一個存儲屬性)? – tilo

+0

在塊中使用'.flatMapLatest {[weak self] _in',然後使用'self?.issueId'。 – solidcell

+0

完美,非常感謝! – tilo

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) 
    } 
+0

謝謝您的回答。但是,你如何將這個應用到'Driver'? – tilo

+0

它看起來像間隔也可以用'Drivers'工作。我更新了前面的示例 – Eluss

+0

太好了,但是我怎麼能將這個應用到我的具體示例? – tilo