I am using the AWS Amplify library https://github.com/aws-amplify/amplify-swift to communicate with the Cognito service. Most of the functions have been rewritten using the new async/await approach.
Looking at the following method:
func fetchAuthSession() async throws -> AuthSession {
return try await Amplify.Auth.fetchAuthSession()
}
How can I wrap the await call to return an Observable<AuthSession>
using RxSwift?
CodePudding user response:
Use Observable.create
to create an Observable
.
Use Task { ... }
to perform async
work.
Use Task { ... }
inside Observable.create
to perform async
work in an Observable
.
Something like this should work:
let authSessionObservable: Observable<AuthSession> = Observable.create { observer in
let task = Task {
do {
let session = try await Amplify.Auth.fetchAuthSession()
observer.on(.next(session))
observer.on(.completed)
} catch {
observer.on(.error(error))
}
}
return Disposables.create {
task.cancel()
}
}
CodePudding user response:
It might help to see a generic version:
extension Observable {
static func create(_ fn: @escaping () async throws -> Element) -> Observable<Element> {
Observable.create { observer in
let task = Task {
do {
observer.on(.next(try await fn()))
observer.on(.completed)
} catch {
observer.on(.error(error))
}
}
return Disposables.create { task.cancel() }
}
}
}
Which would be used in this context like this:
func fetchAuthSession() -> Observable<AuthSession> {
.create(Amplify.Auth.fetchAuthSession)
}