使用RxSwift围绕async/await方法创建Observable

enyaitl3  于 2022-12-10  发布在  Swift
关注(0)|答案(2)|浏览(249)

我正在使用AWS Amplify库https://github.com/aws-amplify/amplify-swift与Cognito服务进行通信。大多数函数都已使用新的async/await方法进行了重写。
看下面的方法:

func fetchAuthSession() async throws -> AuthSession {
    return try await Amplify.Auth.fetchAuthSession()
}

如何 Package await调用以使用RxSwift返回Observable<AuthSession>

mdfafbf1

mdfafbf11#

使用Observable.create建立Observable
使用Task { ... }执行async工作。
Observable.create中使用Task { ... },以在Observable中执行async工作。
应该可以这样做:

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

esbemjvw2#

看一个通用版本可能会有所帮助:

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

在此上下文中使用的是:

func fetchAuthSession() -> Observable<AuthSession> {
    .create(Amplify.Auth.fetchAuthSession)
}

相关问题