使用RxSwift和Parse-Server进行轮询

时间:2017-01-28 21:56:39

标签: ios swift polling parse-server rx-swift

我正在使用Parse-Server作为后端和RxSwift的Apple TV应用程序,我试图建立一个类似于电视流媒体应用程序的身份验证系统。

现在我在解析数据库中有一个AuthenticationCode对象,它有一个代码,设备ID和会话令牌列。我尝试使用RxSwift的间隔每隔5秒对对象执行一次提取,并检查会话令牌列是否已填写。

以下是代码:

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。

感谢。

1 个答案:

答案 0 :(得分: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()
        }
    }
}