我如何用Observable包装异步函数

时间:2019-03-18 16:42:29

标签: ios swift rx-swift

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

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的选项。

我基本上只需要发出可观察到的信号,这样我就可以使用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

的结果

1 个答案:

答案 0 :(得分:1)

这也是我创建可观察对象的方式。我唯一要注意的是添加errors,以便在出现错误时可以处理您的可观察对象,而completion也可以表明您的可观察对象已完成。

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在这里很有用,而且您可以控制希望观测对象出错,失败或完成的方式。

这里的人也提供了一个很好的例子:

Rxswift What difference between Observable.of and Observable<String>.create