首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >URLSession.shared.dataTaskPublisher在iOS13.3上不工作

URLSession.shared.dataTaskPublisher在iOS13.3上不工作
EN

Stack Overflow用户
提问于 2019-12-11 14:14:34
回答 3查看 4.3K关注 0票数 8

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

代码语言:javascript
复制
finished with error [-999] Error Domain=NSURLErrorDomain Code=-999 "cancelled"

如果我使用URLSession.shared.dataTask而不是URLSession.shared.dataTaskPublisher,它将在iOS13.3上工作。

下面是我的代码:

代码语言:javascript
复制
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。

EN

回答 3

Stack Overflow用户

发布于 2019-12-11 18:47:00

你在这里有两个问题: 1.就像@matt said一样,你的出版商活得不够长。您可以将AnyCancellable存储为实例var,或者我喜欢做的(似乎是一种重复的最佳实践)是使用store(in:) to a Set<AnyCancellable>来保留它,并在对象被释放时自动清除它。2.为了触发实际的网络请求,您需要对值执行sinkassign操作。

所以,把这些放在一起:

代码语言:javascript
复制
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)
}
票数 12
EN

Stack Overflow用户

发布于 2019-12-11 14:52:11

您还没有显示足够的代码,但是根据症状可以清楚地看到问题是什么:您的发布者/订阅者对象的寿命不够长。我敢说,你的代码总是错误的,它似乎成功了,这只是一种怪癖。确保您的发布者,尤其是订阅者保留在长期对象中,以便有时间进行网络通信。

下面是一个如何使用数据任务发布器的工作示例:

代码语言:javascript
复制
class ViewController: UIViewController {
    let url = URL(string:"https://apeth.com/pep/manny.jpg")!
    lazy var pub = URLSession.shared.dataTaskPublisher(for: url)
        .compactMap {UIImage(data: $0.data)}
        .receive(on: DispatchQueue.main)
    var sub : AnyCancellable?
    override func viewDidLoad() {
        super.viewDidLoad()
        let sub = pub.sink(receiveCompletion: {_ in}, receiveValue: {print($0)})
        self.sub = sub
    }
}

这将打印<UIImage:0x6000008ba490 anonymous {180, 206}>,这是正确的(您可以自己转到该URL )。

我要说的是,如果你不说self.sub = sub,你就会得到你所报告的错误:订阅者的sub,仅仅是一个本地的,立即消失,网络事务被提前取消(你报告的错误)。

编辑我认为代码是在.store(in:)方法出现之前编写的;如果我今天编写它,我会使用它而不是sub属性。但原理是一样的。

票数 10
EN

Stack Overflow用户

发布于 2019-12-12 02:41:34

我需要将我的可取消集“移到”我的订阅者执行的函数的作用域之上。当可取消集与订阅者的功能具有相同的范围时,这在iOS 13.2中工作得很好,但在13.3中停止工作。dataTaskPublisher取消,并显示上述错误。这是有意义的,可取消集应该“活着”的订阅者。开发人员错误。学到的教训。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59279806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档