我需要将 urlsession 数据任务放在另一个 DispatchQueue 上还是自动完成?

Posted

技术标签:

【中文标题】我需要将 urlsession 数据任务放在另一个 DispatchQueue 上还是自动完成?【英文标题】:Do I need place urlsession datatask on another DispatchQueue or it's done automatically? 【发布时间】:2022-01-21 08:50:15 【问题描述】:

之前没有任何使用数据任务和 urlsessions 的经验。所以我很好奇。案例是 - 试图拥有一个无限滚动的表格。当这个方法被调用时

tableView(_ tableView: UITableView, prefetchRowsAt indexPaths: [IndexPath])

来自 UITableViewDataSourcePrefetching 并在检查至少一个索引路径的行大于当前最大项目后 - 我开始使用 urlsession 数据任务加载新数据。问题是 - 我需要做类似的事情

let queue = DispatchQueue.gloabl(qos: .userInteractive)
queue.async 
  myTaskGoesHere

【问题讨论】:

【参考方案1】:

URLSession 数据任务总是在后台线程上运行。因此,您必须在完成处理程序闭包中切换到主队列才能更新用户界面。因为数据任务的答案是在 ios 启动任务的同一线程上传递的。

顺便说一句,.userInteractive 也在主线程上运行。来自文档:

用户交互任务在系统中具有最高优先级。将此类用于与用户交互或主动更新应用程序用户界面的任务或队列。例如,将其用于动画类或交互式跟踪事件。

【讨论】:

以上是关于我需要将 urlsession 数据任务放在另一个 DispatchQueue 上还是自动完成?的主要内容,如果未能解决你的问题,请参考以下文章

Swift UrlSession 在 UrlSession 中不起作用

Swift 3,未调用 URLSession 数据任务完成处理程序

如何同步 URLSession 任务的串行队列?

URLSessionDownloadTask:取消写入数据

URLSession 下载任务委托仅在所有任务完成后调用

NSURLSessionTaskDelegate 方法 URLSession:task:didCompleteWithError: 从不调用