URLSessionDataTask无法暂停且第二任务需等待首个任务完成问题咨询
问题解答
1. 第二个数据任务等待首个任务完成的原因
这个现象通常和URLSession的调度规则有关,常见原因如下:
- 同一域名并发请求限制:URLSessionConfiguration的
httpMaximumConnectionsPerHost参数控制了同一域名下的最大并发请求数,iOS系统默认值为4,如果你为了控制缩略图下载速度手动将该值改为1,所有同域名请求会串行执行,第二个详情请求必须等前一个同域名请求完全结束后才会发起。 - 批量任务占用连接:如果你是通过单个URLSessionDataTask请求批量返回数百张缩略图的打包接口,这个任务本身是一个长生命周期的TCP连接,会占用一个并发名额,直到所有数据接收完成才会释放。
- 回调队列阻塞:如果你的URLSession绑定的delegateQueue是串行队列,所有请求的回调逻辑会排队执行,就算网络请求本身已经完成,回调也要等前面的任务处理完才会触发,看起来就像请求被阻塞了。
2. suspend()无效但cancel()生效的原因
两个方法的底层实现逻辑完全不同:
suspend()的作用仅为暂停当前任务从网络套接字接收新数据,已经进入系统内核缓冲区的响应数据仍然会被传递给上层,已经发起的TCP请求也不会被中断。对于正在传输大量数据的缩略图下载任务,调用suspend()后需要等缓冲区的数据全部处理完才会真正停止,所以你不会看到立刻生效的效果。cancel()会直接中断当前TCP连接,清空所有缓冲区数据,立刻终止整个任务的生命周期,因此调用后会立刻生效。
推荐实现方案
你不需要手动暂停/恢复缩略图下载任务,只需简单调整即可实现详情请求优先执行:
- 不要修改
httpMaximumConnectionsPerHost的默认值,保证同域名下可以同时处理多个请求 - 给缩略图下载任务设置低优先级:
firstTask.priority = URLSessionTask.lowPriority - 给详情下载任务设置高优先级:
secondTask.priority = URLSessionTask.highPriority
系统网络调度层会自动优先处理高优先级的详情请求,不会影响缩略图的后台下载逻辑。
内容的提问来源于stack exchange,提问作者Stuart
相关产品推荐
相关产品推荐

