使用 RxSwift 和 Parse-Server 进行轮询
Polling with RxSwift and Parse-Server
我正在开发一个使用 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。
谢谢。
更新:
试试这个:
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()
}
}
}
我正在开发一个使用 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。
谢谢。
更新:
试试这个:
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()
}
}
}