如何用 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 如何出错、失败或完成。
这里也有人举了一个很好的例子:
我有一个异步函数,目前看起来像这样
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 如何出错、失败或完成。
这里也有人举了一个很好的例子: