如何用 Observable 包装异步函数

How can I wrap an async function with an Observable

我有一个异步函数,目前看起来像这样

func startLoginFlow() {
    IdentityProvider.shared.login { success, error in
        // on success a user has completed authentication
        if success {
            delegate?.userIsAuthenticated()
        }


        // on error something wen't wrong
        ....
    }
}

基本上在成功时调用委托方法,结果会发生一些操作。

我想将其封装为一个可观察对象。我没有选项重构 IdentityProvider.shared.login.

我基本上只需要发出 observable,这样我就可以使用 onNext.

订阅并在别处采取行动

我目前正在做以下事情

  func startLoginFlow() -> Observable<Void> {
        return Observable.create { [weak self] observable in
            IdentityProvider.shared.login { success, error in
                if success {
                    observable.onNext(Void())
                }
            }
            return Disposables.create()
        }
    }

这是最好的方法吗?我不确定是否应该使用 Observable.of 并订阅 IdentityProvider.shared.login

的结果

这也是我创建 Observables 的方式。我唯一要注意的是添加 errors 以便您可以在它出错时处理您的 observable,以及 completion,以表明您的 observable 已完成。

func startLoginFlow() -> Observable<Void> {
        return Observable.create { [weak self] observable in
            IdentityProvider.shared.login { success, error in
                if success {
                    observable.onNext(())
                    observable.onCompleted()
                } else {
                    observable.onError(error)
                }
            }
            return Disposables.create()
        }
    }

Observable.of 在这种情况下也是如此。它只是发出 completed 方法。如果您尝试使用这两种方法创建 Observable<String>,您可以自己测试一下。

我发现做 Observable.create 在这里是有益的,因为你正在做网络请求,你可以控制你希望你的 observables 如何出错、失败或完成。

这里也有人举了一个很好的例子: