- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何转换 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)
}
}
最佳答案
据我了解,使用 .asSingle
的原因在 RxSwift 中,当您订阅时,您的订阅者会收到一个 SingleEvent
这是一个 .success(value)
或 .error(error)
.因此,您的订阅者不必担心收到 .completion
事件类型,因为没有。
没有与Combine 中的等价物。在Combine 中,从订阅者的角度来看,Future
只是另一种 Publisher
它可以发出输出值和 .finished
或 .failure(error)
.类型系统不强制执行 Future
的事实。从不发出 .finished
.
因此,没有程序上的理由返回 Future
具体来说。你可以争辩说返回 Future
记录您始终只返回一个输出或失败的意图。但这不会改变您编写订阅者的方式。
此外,由于Combine 大量使用泛型,只要您想将任何运算符应用于Future
,你已经没有 future 了。如果您申请 map
给一些 Future<V, E>
,你会得到一个 Map<Future<V, E>, V2>
, 和其他每个运算符类似。这些类型很快就失控并掩盖了存在 Future
的事实。在底部。
如果你真的想,你可以实现你自己的操作符来转换任何 Publisher
到 Future
.但是你必须决定如果上游发出 .finished
该怎么办, 因为 Future
无法发射 .finished
.
extension Publisher {
func asFuture() -> Future<Output, Failure> {
return Future { promise in
var ticket: AnyCancellable? = nil
ticket = self.sink(
receiveCompletion: {
ticket?.cancel()
ticket = nil
switch $0 {
case .failure(let error):
promise(.failure(error))
case .finished:
// WHAT DO WE DO HERE???
fatalError()
}
},
receiveValue: {
ticket?.cancel()
ticket = nil
promise(.success($0))
})
}
}
}
关于ios - 将 URLSession.DataTaskPublisher 转换为 Future 发布者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60428303/
如何模拟 URLSession.DataTaskPublisher?我有一个类 Proxy 需要注入(inject)一个 URLSessionProtocol protocol URLSessionP
在下面的代码中,应用程序对象数组用于创建发布者数组,这些发布者数组被合并到发布对象数组中。 apps.map { latestRelease(app: $0) }.merge() 这是最新版本的完成方
在 Xcode 11 beta 5 或 6 中,我现有的代码依赖于 URLSession.DataTaskPublisher停止工作。好像DataTaskPublisher从不发布任何值,但我不知道为
之前 URLSession.shared.dataTask(for request: URLRequest) { data, error, response in ... } data 字段以及其他字
我想从 REST API 获取数据,为此,我需要先获取 ID 数组 - 第一次调用。之后,我需要使用每个 ID 进行 API 调用。我不想使用 completionHandlers,而是使用 Comb
我最近遇到了两个数据获取(下载)API,它们对我来说似乎是一样的。我不知道什么时候应该使用一个而不是另一个。 我可以用 URLSession.shared.dataTask var tasks
如何转换 URLSession.DataTaskPublisher至 Future在组合框架中。 在我看来, Future 发布者在这里更合适,因为调用只能发出一个响应并最终失败。 在 RxSwift
我有一个简单的问题,我只能在documentation中看到dataTaskPublisher我可以通过它调用 get web 服务,但是如何调用可以返回发布者的 post web 服务呢? 最佳答案
我正在努力从 URLSession 的 ApiErrorResponse 形成一个强类型错误对象(我下面示例中的 .dataTaskPublisher(for:) 对象)出版商,但找不到线索。在这里,
尝试发出网络请求时,出现错误 finished with error [-999] Error Domain=NSURLErrorDomain Code=-999 "cancelled" 如果我使用
尝试发出网络请求时,出现错误 finished with error [-999] Error Domain=NSURLErrorDomain Code=-999 "cancelled" 如果我使用
将我们的 API 客户端切换到组合后,我们开始收到用户关于错误“操作无法完成 (NSURLErrorDomain -1.)”的报告,即 error.localizedDescription从我们的 A
我是一名优秀的程序员,十分优秀!