Опрос с помощью RxSwift и Parse-Server

Я работаю над приложением Apple TV, которое использует Parse-Server в качестве бэкэнда и RxSwift, и я пытаюсь настроить систему аутентификации, аналогичную той, что используется в приложениях для потоковой передачи ТВ.

Прямо сейчас у меня есть объект AuthenticationCode в базе данных синтаксического анализа, в котором есть код, идентификатор устройства и столбец токена сеанса. Я пытаюсь использовать интервал 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.

Спасибо.


person RPK    schedule 28.01.2017    source источник


Ответы (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()
            }
        }
    }
person xandrefreire    schedule 29.01.2017
comment
Я пробовал оба из них, но с каждым получаю ошибки. Для варианта 1 я получаю ошибку Argument passed to call that takes no argument, а для варианта 2 - ошибку Value of type 'Observable<Int>' has no member 'dispose'. - person RPK; 29.01.2017
comment
Конечно ... моя ошибка. Не могли бы вы написать свой poll звонок? - person xandrefreire; 29.01.2017
comment
Я отредактировал свой ответ и создал простую суть, чтобы понять его. - person xandrefreire; 29.01.2017
comment
Это исправило это. Спасибо! - person RPK; 29.01.2017