【发布时间】:2020-02-27 07:35:39
【问题描述】:
如何在组合框架中将URLSession.DataTaskPublisher 转换为Future。
在我看来,Future 发布者在这里更合适,因为调用只能发出一个响应并最终失败。
在 RxSwift 中有类似 asSingle 的辅助方法。
我已经使用以下方法实现了这种转换,但不知道这是否是最好的方法。
return Future<ResponseType, Error>.init { (observer) in
self.urlSession.dataTaskPublisher(for: urlRequest)
.tryMap { (object) -> Data in
//......
}
.receive(on: RunLoop.main)
.sink(receiveCompletion: { (completion) in
if case let .failure(error) = completion {
observer(.failure(error))
}
}) { (response) in
observer(.success(response))
}.store(in: &self.cancellable)
}
}
有什么简单的方法吗?
【问题讨论】:
-
URLSession.DataTaskPublisher还保证它只能发出 1 个值或失败,所以我真的看不出有任何理由将其转换为Future会产生任何真正的好处。 -
这个问题不是“基于意见的”。这个想法是否好是基于意见的,但问题不在于它是否是一个好主意。它在问如何编写代码。
-
@robmayoff 我没有投票结束,但不是。它呈现一些代码并询问它是“最好的”并且是“简单”的方式。这些都是基于意见的标志。
-
“在 RxSwift 中有像
asSingle这样的辅助方法?”是一个事实问题。 “有什么简单的方法可以做到这一点吗?”是基于意见的,但我认为最简单的是我们可以找到广泛的共识。耸耸肩。