我有一堆要转换为RxSwift的结果完成处理程序的函数。
他们遵循以下约定:
func fetch(id: Int, completion: @escaping (Result<AuthorType, DataError>) -> Void) {...}
我可以使用典型的:
return Observable<AuthorType>.create { on(.next... }
是否有更体贴的通用方法like PromiseKit does:
func fetch() -> Promise<AuthorType> {
return Promise { fetch(completion: $0.resolve) }
}
RxSwift中有这种可能吗?
答案 0 :(得分:0)
没有一个像您所要求的那样的构造函数,但是创建它很容易:
extension ObservableType {
static func createFromResultCallback<E: Error>(_ fn: @escaping (@escaping (Result<Element, E>) -> Void) -> ()) -> Observable<Element> {
return Observable.create { observer in
fn { result in
switch result {
case .success(let value):
observer.onNext(value)
observer.onCompleted()
case .failure(let error):
observer.onError(error)
}
}
return Disposables.create()
}
}
}
以您的示例为例,它的用法如下:
func fetch(id: Int) -> Observable<AuthorType> {
return .createFromResultCallback { fetch(id: id, $0) }
}
如果您有一个仅接受回调的函数,例如:
func shortFetch(_ completion: @escaping (Result<AuthorType, DataError>) -> Void)
然后您就可以通过上述操作创建一个Observable:
Observable.createFromResultCallback(shortFetch)
记住,将函数包装在这样的Observable中后,行为上会有很大的不同。现在很冷,这意味着它只有在某些事物订阅了可观察对象之后才执行,并且在每次有事物订阅时才执行。这不同于Promise,Promise仅立即执行一次。