swift - URLSession.shared.dataTaskPublisher 在 IOS 13.3 上不起作用

标签 swift swiftui combine ios13.3

尝试发出网络请求时,出现错误

finished with error [-999] Error Domain=NSURLErrorDomain Code=-999 "cancelled"

如果我使用 URLSession.shared.dataTask而不是 URLSession.shared.dataTaskPublisher它将在 IOS 13.3 上运行。

这是我的代码:
return  URLSession.shared.dataTaskPublisher(for : request).map{ a in
    return a.data
}
.decode(type: MyResponse.self, decoder: JSONDecoder())
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()

此代码适用于 IOS 13.2.3。

最佳答案

你在这里有两个问题:
1. 就像@matt 所说,你的出版商活得不够长。您可以存储 AnyCancellablevar为例,或者我喜欢做的(并且似乎是一个 redux 最佳实践)是使用 store(in:)Set<AnyCancellable>保留它并在对象被释放时自动清理它。
2. 为了启动实际的网络请求,您需要 sinkassign值(value)。

所以,把这些放在一起:

var cancellableSet: Set<AnyCancellable> = []

func getMyResponse() {
  URLSession.shared.dataTaskPublisher(for : request).map{ a in
    return a.data
  }
  .decode(type: MyResponse.self, decoder: JSONDecoder())
  .receive(on: DispatchQueue.main)
  .replaceError(with: MyResponse())
  .sink { myResponse in print(myResponse) }
  .store(in: &cancellableSet)
}

关于swift - URLSession.shared.dataTaskPublisher 在 IOS 13.3 上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59279806/

相关文章:

ios - 单例中的@Published 属性在第一个事件之后不发出事件

ios - Realm deleteAll() 是否重置主键

swift - 新创建的 pod 项目中的 "classes"文件夹在哪里(来自 'pod lib create' )

html - NSAttributedString 从 HTML 暗模式初始化,如何设置默认前景色?

ios - 如何创建仅在使用 SwiftUI 打开应用程序时出现的警报?

core-data - 如何根据相关对象转换 SwiftUI 获取请求结果?

ios - 结合框架第三个 `collect`方法

ios - 演示前取消通知

swift - 在 iOS16.4 中 TextField 内的电子邮件提示呈现蓝色

swift - 防止立即调用接收器接收值关闭