使用 RxSwift 和 Parse-Server 进行轮询

Posted

技术标签:

【中文标题】使用 RxSwift 和 Parse-Server 进行轮询【英文标题】:Polling with RxSwift and Parse-Server 【发布时间】:2017-01-28 21:56:39 【问题描述】:

我正在开发一个使用 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】:

更新:

试试这个:

    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()
            
        
    

【讨论】:

我尝试了这两种方法,但每种方法都有错误。对于选项 1,我收到错误 Argument passed to call that takes no argument,对于选项 2,我收到错误 Value of type 'Observable&lt;Int&gt;' has no member 'dispose' 当然……我的错。你能写下你的poll电话吗? 我已经编辑了我的答案并创建了一个simple gist 来理解它 修复了它。谢谢!

以上是关于使用 RxSwift 和 Parse-Server 进行轮询的主要内容,如果未能解决你的问题,请参考以下文章

parse-server:如何区分用户类 BeforeSave 中的 signUp 和常规 ParseUser.save?

如何使用 iptables 和 parse-server (Parse Server) 将 HTTP 重定向到 HTTPs

Parse-Server后台搭建与使用进阶篇(二)- Parse-server常见问题及解决方法

Parse-Server - 无法从远程机器上的数据库中获取数据

与 parse-server 和 auth0 的自定义身份验证集成

使用 Parse-Server 时 Parse LocalDataStore 不起作用 - “方法需要启用固定。”