我在使用NSURLSessionDownloadTask处理ios上的“空间不足”/“完整磁盘”错误时遇到问题
如果由于在应用程序中完成下载而磁盘已满,我会接到
的电话URLSession(会话:NSURLSession,任务:NSURLSessionTask,didCompleteWithError错误:NSError?)
错误包含域NSPOSIXErrorDomain和错误代码ENOSPC
但这只发生一次任务,而不是所有正在运行的
Ex:如果我当时有3个任务正在运行,我只能为其中一个运行,另外2个仍处于运行状态 它们不接收任何字节,但它们也不会失败。 更重要的是,在任何这些任务上调用取消会将其状态从“运行”更改为“取消”,并且它们将无限期地保持这样状态。
我的解决方案是,当我第一次收到此错误时,为会话调用invalidateAndCancel并处理所有正在运行的任务的失败。 当“完整磁盘”由应用程序下载引起时,这似乎有效。 但如果“完整磁盘”错误是由外部下载引起的(例如:iTunes文件共享,下载播客,其他应用程序下载)我在应用程序中没有收到任何错误 我的所有下载任务都在运行或取消(如果我尝试取消它们) 他们不下载任何东西,他们不会因NSURLSessionDelegate或NSURLSessionDownloadDelegate的任何回调而失败
在开始下载之前,我会检查设备上的可用空间 我还考虑了当前正在运行的任务 但我无法控制设备上可能最终触发“完整磁盘”警告的其他下载
我该如何处理这些案件? 虽然下载任务不再下载,但它们是否仍处于运行状态? 我不应该为每个任务或至少为会话调用带有(NSPOSIXErrorDomain,ENOSPC)的didCompleteWithError调用吗? 或者至少我不能成功取消它们?并得到一个didCompleteWithError调用?
我是否缺少一个委托电话,让我知道是时候关闭所有正在运行的任务?
我正在使用共享后台会话进行更多后台下载任务
使用NSURLSession创建下载任务: func downloadTaskWithRequest(_ request:NSURLRequest) - > NSURLSessionDownloadTask
使用NSURLSessionConfiguration创建sesion配置: class func backgroundSessionConfigurationWithIdentifier(_ identifier:String) - > NSURLSessionConfiguration
使用NSURLSession创建了seesion init(配置配置:NSURLSessionConfiguration, 委托代表:NSURLSessionDelegate?, delegateQueue队列:NSOperationQueue?)
我正在使用NSOperationQueue,其maxConcurrentOperationCount为3 我已经实现了我的NSURLSessionDelegate和NSURLSessionDownloadDelegate
任务似乎在前台和后台运行良好。
由于
Ps:使用Xocde7,ios9 sdk,在ios9设备上测试
答案 0 :(得分:-1)
我也向Apple询问了这个问题,答案又回来了:
好像是,因为后台会话使用磁盘来保持其状态,当磁盘已满时的行为不能完全可靠地返回ENOSPC
完整磁盘盒的处理是开发人员现在的责任:
在开始下载之前检查磁盘空间
在您的应用程序下载时监控磁盘空间 - 如果您的应用程序位于前台,或者您的应用程序在后台恢复(或重新启动),请主动监视可用的磁盘空间。如果低于某个阈值,请暂停下载(通过调用-cancelByProducingResumeData:,以便稍后恢复)。