NSURLSessionDownloadTask 出现存储几乎已满磁盘警告的问题

2024-05-12

我在使用 NSURLSessionDownloadTask 处理 ios 上的“空间不足”/“磁盘已满”错误时遇到问题

如果由于应用程序中完成下载而导致磁盘已满,我会接到电话

URLSession(会话:NSURLSession,任务:NSURLSessionTask,didCompleteWithError 错误:NSError?)

错误具有域 NSPOSIXErrorDomain 和错误代码 ENOSPC

但这仅对一个任务发生一次,而不是对所有运行的任务发生一次

例如:如果我当时有 3 个任务正在运行,我只会为其中一个任务获取此信息,而其他 2 个任务仍处于“正在运行”状态 它们不会收到任何字节,但也不会失败。 此外,对任何这些任务调用取消会将其状态从“正在运行”更改为“正在取消”,并且它们会无限期地保持这种状态。

我的解决方案是,当我第一次收到此错误时,为会话调用 invalidateAndCancel 并处理所有正在运行的任务的失败。 当“磁盘已满”是由应用程序的下载引起时,这似乎有效。 但是,如果“全盘”错误是由外部下载引起的(例如:iTunes 文件共享、下载播客、下载其他应用程序),我在应用程序中不会收到错误 我的所有下载任务仍处于“正在运行”或“正在取消”状态(如果我尝试取消它们) 他们不下载任何东西,他们不会因 NSURLSessionDelegate 或 NSURLSessionDownloadDelegate 的任何回调而失败

在开始下载之前,我会检查设备上的可用空间 我还考虑了当前正在运行的任务 但我无法控制设备上的其他下载,这些下载最终可能会触发“磁盘已满”警告

我该如何处理这些情况? 下载任务虽然不再下载,但仍应保持运行状态吗? 我不应该为每个任务或至少为会话调用 (NSPOSIXErrorDomain, ENOSPC) 的 didCompleteWithError 调用吗? 或者至少我不应该能够成功取消它们吗?无论如何都会得到 didCompleteWithError 调用吗?

我是否缺少一个委托调用,让我知道是时候关闭所有正在运行的任务了?

我正在使用共享后台会话来执行更多后台下载任务

下载任务是使用 NSURLSession 创建的: func downloadTaskWithRequest(_ request: NSURLRequest) -> NSURLSessionDownloadTask

会话配置是使用 NSURLSessionConfiguration 创建的: 类 func backgroundSessionConfigurationWithIdentifier(_ 标识符: String) -> NSURLSessionConfiguration

该会话是使用 NSURLSession 创建的 初始化(配置配置:NSURLSessionConfiguration, 委托委托:NSURLSessionDelegate?, delegateQueue队列:NSOperationQueue?)

我使用 maxConcurrentOperationCount 为 3 的 NSOperationQueue 我已经实现了 NSURLSessionDelegate 和 NSURLSessionDownloadDelegate

任务似乎在前台和后台运行良好。

Thanks

ps:使用Xocde7、ios9 sdk,在ios9设备上测试


我也曾向Apple询问过这个问题,得到的答复是:

看起来,因为后台会话使用磁盘来保存其状态,所以磁盘已满时的行为返回 ENOSPC 并不完全可靠

目前,处理全盘情况是开发人员的责任:

  • 开始下载之前检查磁盘空间

  • 下载应用程序时监视磁盘空间 - 如果您的应用程序位于前台,或者您的应用程序在后台恢复(或重新启动),请主动监视可用磁盘空间。如果低于某个阈值,则暂停下载(通过调用 -cancelByProducingResumeData:,以便稍后可以恢复下载)。

如需详细答案,请检查:https://forums.developer.apple.com/thread/43263 https://forums.developer.apple.com/thread/43263

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSURLSessionDownloadTask 出现存储几乎已满磁盘警告的问题 的相关文章

随机推荐

  • 两个服务如何以双向方式相互通信?

    一种是通过事件 另一种是通过调用方法 我试图在我的应用程序中实现聚合模式 我有 AuthService 在这里我处理身份验证结果并发出事件 if auth this eAuth emit true else this eAuth emit
  • Entity Framework Code First TPH 继承 - 不同的子类可以共享一个字段吗?

    我有一个使用 Entity Framework Code First 创建的实体框架模型 该模型使用每个层次结构表继承 其中结构看起来有点像这样 public abstract class BaseState public int Id g
  • 如何使用Python中字符串变量中存储的证书打开ssl套接字

    在Python中 ssl wrap socket可以从文件中读取证书 ssl wrap socket需要证书作为文件路径 如何使用从字符串变量读取的证书启动 SSL 连接 我的主机环境不允许写入文件 并且临时文件模块不起作用我正在使用Pyt
  • 使用 SSL 设置 .Net IBM.XMS 客户端

    我必须创建一个客户端来侦听队列上的消息 正在使用 SSL 我正在 dot net 中进行开发 我浏览了数百页的文档和论坛 找到了一些清晰简洁的内容 但看起来事实并非如此 我有一个 jks 并且我能够 telnet 到正在发布队列的服务器 下
  • 对于简单查询,SNIReadSync 的执行时间为 120-500 毫秒。我要寻找什么?

    我正在对 SQL Server 2005 执行一个简单的查询 protected static void InitConnection IDbCommand cmd cmd CommandText set transaction isola
  • SVG 图标像素对齐?

    在此图像中 左侧 黑色 垃圾桶是图标字体 它的字体大小是 16px 这使得图标在 100 的时间里看起来都很清晰 两个蓝色垃圾桶是 SVG 它们具有完全相同的标记 其中之一happened一个是像素对齐的 另一个不是 我怎样才能强制我的 S
  • 使用带有图像的 C# 代码生成 pdf 文件的大小限制是多少?

    我正在使用 Web 应用程序使用 C 代码生成 PDF 文件 PDF 文件包含 tiff 图像 如果包含图像的文件夹大小超过 1GB 则浏览器将自动关闭 使用 C 代码生成 PDF 文件的图像大小限制是多少 您问题的答案取决于三个参数 PD
  • 简单的客户端和服务器[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 可以引导我找到一个链接或程序 以便在 Linux 上运行简单的客户端和服务器 C 或 C 代码 要求是应
  • Ubuntu 16.04 - Apache 2.4.18 - 请求 URI 太长

    我试图从 Google 图片搜索结果中保存图像 但是当我在查询字符串参数中发送图像的 src 时 会出现以下错误 Request URI Too Long The requested URL s length exceeds the cap
  • Android、AdMob:AdMob 广告刷新会破坏帧速率

    我正在开发一款游戏 并且进展顺利 不过 我确实对 AdMob 广告刷新有一些疑问 每次刷新广告或绘制广告的不同方面时 我的帧速率都会急剧下降 几乎使游戏无法玩 这是我用于加载广告的内容 ad new AdView this AdSize B
  • 无法使用 django-mssql 提供程序

    有谁知道如何使用 django mssql 提供程序 我已经安装了要求 但无法让它工作 如果 settings py 中没有 sqlserver ado 它可以正常导入 testenv C Users Robin test gt pytho
  • 应该使用encodeURI吗?

    javascript 的encodeURI 函数有任何有效用途吗 据我所知 当您尝试发出 HTTP 请求时 您应该 完整的 URI 您想要放入 URI 中的某些片段 可以是 unicode 字符串或 UTF 8 字节序列 在第一种情况下 显
  • 在iframe中显示本地htm文件?

    我使用 MailBee NET 对象以 htm 格式在本地计算机上保存一些电子邮件 例如 使用服务器上的电子邮件 messageID 为每封电子邮件创建一个单独的文件夹 D 电子邮件 GmailId1380ec660e0e656a doc
  • Gradle 构建错误

    由于此错误 我的构建失败 评估项目 DBSupport 时出现问题 gt 找不到 参数 project Core Platform 上提供的方法providedCompile 项目 DBSupport 知道这意味着什么吗 descripti
  • Guard 不会加载 WDM

    我正在学习 Michael Hartl 的 Rails 教程 到目前为止该教程非常出色 我在高级设置一章中 他以有利于 TDD 的方式配置 Rails 环境 我安装了 Guard 并且通过运行我在 spec 文件夹中的测试 它一直正常运行
  • Rails:测试需要访问 Rails 环境的助手(例如 request.fullpath)

    我有一个可以访问的助手request fullpath 在孤立的辅助测试中 request不可用 我应该怎么办 我可以以某种方式嘲笑它或类似的东西吗 我正在使用最新版本的 Rails 和 RSpec 这是我的助手的样子 def item a
  • 在将字符串传递给 int() 之前,如何检查它是否为负数?

    我正在尝试编写一些内容来检查字符串是数字还是负数 如果它是一个数字 正数或负数 它将通过 int 传递 不幸的是 当包含 时 isdigit 不会将其识别为数字 这是我到目前为止所拥有的 def contestTest Neutral po
  • 如何将文本转换为标题大小写?

    我有一个文本文件 其中包含需要更改为标题大小写的标题列表 单词应以大写字母开头 但大多数冠词 连词和介词除外 例如 这个书名列表 barbarians at the gate hot flat and crowded A DAY LATE
  • 正则表达式最小值4 个字符,最多 11 个,允许空格和特殊字符

    我在 RegularExpressionValidator NET 控件上有一个正则表达式 w 4 11 工作正常 它允许字符串长度在 4 到 11 之间 我希望它允许空格和特殊字符 例如 丹麦语字符 有什么建议么 怎么样 4 11 或者只
  • NSURLSessionDownloadTask 出现存储几乎已满磁盘警告的问题

    我在使用 NSURLSessionDownloadTask 处理 ios 上的 空间不足 磁盘已满 错误时遇到问题 如果由于应用程序中完成下载而导致磁盘已满 我会接到电话 URLSession 会话 NSURLSession 任务 NSUR