首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >背景URLSession卡住

背景URLSession卡住
EN

Stack Overflow用户
提问于 2021-02-19 13:50:12
回答 1查看 621关注 0票数 0

我使用URLSession将很多文件上传到服务器,因为上传的文件可能很大,我使用的是URLSessionConfiguration.background,这样我的上传就可以在后台继续。

我的url会话声明如下:

代码语言:javascript
复制
urlSessionConfiguration = URLSessionConfiguration.background(withIdentifier: UploadQueue.uploadQueueIdentifier)
urlSessionConfiguration.sessionSendsLaunchEvents = true
urlSessionConfiguration.shouldUseExtendedBackgroundIdleMode = true
urlSessionConfiguration.allowsCellularAccess = true
urlSessionConfiguration.sharedContainerIdentifier = appGroup
backgroundUploadSession = URLSession(configuration: urlSessionConfiguration, delegate: self, delegateQueue: nil)

URLSessionUploadTask总是在前台创建的(我们只使用后台会话来确保任务能够完成)。

代码语言:javascript
复制
var request = try! URLRequest(url: url, method: .put)
backgroundUploadSession.uploadTask(with: request, fromFile: fileUrl).resume() 

当上传~100个文件并保持在前台时,所有必要的委托都会正常实现和调用。然而,当上传大量文件(~1000)时,第一个文件上传正确,但经过一段时间后,会话似乎“卡住”,没有回调。(应用程序仍然在前台)我注意到,如果我只是等待,上传重新启动后~5分钟。

我试着用URLSessionConfiguration.default代替URLSessionConfiguration.default,它在前景中运行得很好。是URLSessionConfiguration.background的错误还是我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-04 16:38:15

在调查之后,出现了多个问题:

  1. 我们原以为URLSessionConfiguration.httpMaximumConnectionsPerHost会限制开放连接的数量。然而,当使用http/2或服务器在代理后面时,这个限制似乎没有得到遵守。

解决方案:做你自己的连接限制(例如。(用DispatchGroup)

  1. 即使在限制并发上传的数量时,后台会话在一段时间后似乎也会陷入停滞,即使应用程序位于前台中。背景会话有一个速率限制器,但是文档说,当应用程序在后台时,它没有被认可。

解决方案:这是苹果开发者论坛讨论,这是中的一个bug。已经做了一份错误报告。目前,解决方案就是不要用小文件创建太多的后台会话。

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

https://stackoverflow.com/questions/66278838

复制
相关文章

相似问题

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