一般将转换结果转换为Rx?

时间:2019-08-17 19:49:30

标签: swift asynchronous rx-swift

我有一堆要转换为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中有这种可能吗?

1 个答案:

答案 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仅立即执行一次。