2016-09-06 15 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と非常によく似ています。

その後、timerflatMapLatest使用する必要があります:あなたの答えのための

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

感謝を。しかし、これを「ドライバー」にどうやって適用しますか? – tilo

+0

インターバルは 'Drivers'でも同様です。以前の例 – Eluss

+0

を更新しましたが、これを私の具体例にどのように適用できますか? – tilo

関連する問題