2017-01-28 16 views
1

私はParse-ServerをバックエンドとRxSwiftとして使用するApple TVアプリケーションで作業しています。私はテレビストリーミングアプリケーションの認証システムと同様の認証システムを設定しようとしています。RxSwiftとParse-Serverでのポーリング

今私はコード、デバイスID、およびセッショントークン列を持つ認証データベース内にAuthenticationCodeオブジェクトを持っています。私はオブジェクトのフェッチを5秒ごとに実行するためにRxSwiftの間隔を使用しようとしており、セッショントークン列が記入されているかどうかを確認しています。ここで

コードです:

func poll(authorizationCode: AuthorizationCode) -> Observable<AuthorizationCode> { 
    return Observable<Int>.interval(5, scheduler: MainScheduler.instance).flatMap({ _ in 
     return Observable<AuthorizationCode>.create { observer -> Disposable in 
      authorizationCode.fetchInBackground(block: { (authorizationCode, error) in 
       if let authorizationCode = authorizationCode as? AuthorizationCode { 
        observer.onNext(authorizationCode) 

        if authorizationCode.sessionToken != nil { 
         observer.onCompleted() 
        } 
       } else if let error = error { 
        observer.onError(error) 
       } 
      }) 

      return Disposables.create() 
     } 
    }) 
} 

は、私がonNextイベントで、私は、オブジェクトをフェッチし、私はセッションコードが存在する場合のシーケンスを終了するたびに発光しています。

このコードで問題が発生しているのは、セッショントークンが記入され、onCompletedが呼び出された後でも、タイマーはまだ起動し、サブスクライバはonCompletedイベントを取得しないということです。

これに関するお手伝いがあります。

また、どうやってこれをやっていけばいいか教えてください。

私はParse-Serverライブクエリを使用しますが、現在はtvOSをサポートしていません。

ありがとうございました。

答えて

3

更新日:

はこのお試しください:

func poll(authorizationCode: AuthorizationCode) -> Observable<AuthorizationCode> { 
    // 1. Return the Observable 
    return Observable<AuthorizationCode>.create { observer -> Disposable in 
     // 2. We create the interval here 
     let interval = Observable<Int>.interval(5, scheduler: MainScheduler.instance) 

     // 3. Interval subscription 
     let subscription = 
     interval.subscribe(onNext: { _ in 
      // 4. Fetch 
      authorizationCode.fetchInBackground(block: { (authorizationCode, error) in 
       // 5. onNext, onCompleted, onError 
       if let authorizationCode = authorizationCode as? AuthorizationCode { 
        observer.onNext(authorizationCode) 

        if authorizationCode.sessionToken != nil { 
         observer.onCompleted() 
        } 
       } else if let error = error { 
        observer.onError(error) 
       } 
      }) 
     }) 

     return Disposables.create{ 
      subscription.dispose() 
     } 
    } 
} 
+0

を私はそれらの両方を試してみましたが、私はそれぞれにエラーが発生します。オプション1の場合、引数 '引数なしの呼び出しに引数が渡されました 'が表示され、オプション2の場合'タイプの値 'エラーが発生します。Observable 'にメンバー 'dispose''がありません – RPK

+0

もちろん間違いです。 'poll'コールを書いてください。 – XFreire

+0

私は自分の答えを編集して、それを理解するために[簡単な要点](https://gist.github.com/XFreire/62af2b8121dca1db9c9e0a017de47c40)を作成しました。 – XFreire