我有一些使用RxSwift编写的代码,并尝试将其转换为使用苹果的Combine框架。
非常常见的一种模式是对于一次性可观察对象(通常是网络请求),使用Observable.create
。类似这样:
func loadWidgets() -> Observable<[Widget]> {
return Observable.create { observer in
// start the request when someone subscribes
let loadTask = WidgetLoader.request("allWidgets", completion: { widgets in
// publish result on success
observer.onNext(widgets)
observer.onComplete()
}, error: { error in
// publish error on failure
observer.onError()
})
// allow cancellation
return Disposable {
loadTask.cancel()
}
}
}
我正在尝试将这个映射到Combine中,但我还没有能够完全弄清楚。我能够得到的最接近的结果是像下面这样使用Future:
func loadWidgets() -> AnyPublisher<[Widget], Error> {
return Future<[Widget], Error> { resolve in
// start the request when someone subscribes
let loadTask = WidgetLoader.request("allWidgets", completion: { widgets in
// publish result on success
resolve(.success(widgets))
}, error: { error in
// publish error on failure
resolve(.failure(error))
})
// allow cancellation ???
}
}
正如你所看到的,它完成了大部分工作,但没有取消的能力。 其次, future 不允许多个结果。
有没有类似于 Rx 的 Observable.create
模式,可以取消并可选地返回多个结果的方式?
Deferred
中可以解决这个bug。此外,这个解决方案在下游发出需求之前就发出了值。它应该等到那时才发出。 - undefinedDeferred
中可以解决这个问题。此外,这个解决方案在下游发出需求之前就会发出值。它应该等到那时再执行。 - Daniel T.