使用 RxSwift 和 Parse-Server 进行轮询

RPK*_*RPK 2 polling ios swift rx-swift parse-server

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

现在,我在解析数据库中有一个 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()
        }
    })
}
Run Code Online (Sandbox Code Playgroud)

每次获取对象时,我都会发出 onNext 事件,并且我想在会话代码存在时终止序列。

我在这段代码中遇到的问题是,即使在填写了会话令牌并调用了 onCompleted 之后,计时器仍然会触发,并且订阅者永远不会获得 onCompleted 事件。

如有任何帮助,我们将不胜感激。

另外,如果我不知道该怎么做,请告诉我。

我会使用 Parse-Server 实时查询,但它们目前不支持 tvOS。

谢谢。

XFr*_*ire 5

更新:

尝试这个:

    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(.seconds(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()
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)