如何从已完成的“NSURLSessionDataTask”获取数据?

2024-03-07

我知道我可以使用dataTaskWithURL:completionHandler:获取completionHandler 块中的数据,但这会阻止委托方法触发,我需要didReceiveData:触发方法,因为这是我配置进度指示器的方式。

我完全不知道如何在下载完成后获取数据。相当于完成块的委托方法是什么?didCompleteWithError似乎没有返回任何NSData.

我不必手动将数据拼凑在一起didReceiveData,我呢?当completionHandler 把它交给你时,这看起来真的很蹩脚。如果不是因为我可以同时下载 50 多个东西,我不介意这样做,所以跟踪所有部分数据似乎很痛苦。我应该切换到NSURLSessionDownloadTask?


是的,您必须手动将数据拼凑在一起(或者,如果数据真的很大并且您不希望它占用内存,则可以将其流式传输到文件中)。

So, didReceiveData方法将返回您的数据。所以您应该实例化一个NSMutableData(例如,在didReceiveResponse) 到哪个didReceiveData将在数据进来时追加数据。didCompleteWithError被调用,假设错误是nil,您可以确信您的NSMutableData现在包含收到的所有数据。正如您所指出的,挑战在于跟踪所有 50 多个下载,因此我维护一个以任务标识符为键的字典,以跟踪将数据附加到哪个目录。 (我个人认为这是一个设计缺陷NSURLSession在会话级别实现任务、下载和上传委托,而不是让我们为每个任务实例化单独的任务委托对象。但我们还是坚持现有的东西。)

如果您只是下载数据,NSURLSessionDownloadTask是一个很好的选择(并且在内存使用方面比仅仅附加到更有效NSMutableData实例),并且如果您愿意,您也可以使用后台会话(您不能使用NSURLSessionDataTask).

最后,如果您确实进行了 50 多次下载,您可能需要考虑将下载任务包装在NSOperation子类,以便您可以限制并发运行的数量,而不会冒任何超时的风险。

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

如何从已完成的“NSURLSessionDataTask”获取数据? 的相关文章

随机推荐

  • 如何在 SharedPreferences 中存储 ArrayList> ?

    我希望在 SharedPreferences 中存储一个包含 Hashmap 的 ArrayList 我怎样才能做到这一点 您可以将集合转换为 json 并将其存储在共享首选项中 每当您需要获取数据时 只需获取字符串并将 JSON 转换回您
  • 哈希表。命名历史。为什么不用哈希表呢?

    we know ArrayList LinkedList TreeMap 以及其他 以及所有名称均采用 CamelCase 格式 但为什么Hashtable not HashTable 这是一个无原则的问题 只是想知道 Hashtable是
  • 当前枚举命名空间中的全局变量的首选方法是什么?

    我曾经为此查看 G 的源代码 但最近 Intersystems 已停止分发 INT 代码 我想理论上我可以在循环中使用 eXecute 语句来检查每个合法全局名称上的 D 但这是愚蠢且不合理的慢 那么目前正确的做法是什么 您始终可以在中使用
  • 如何从 Visual Studio 文件搜索中排除 Designer.cs

    在 Visual Studio 2005 8 中进行搜索时 是否有办法排除特定类型的 cs 文件 Example 在重构场景中 我可能会搜索以识别代码中的字符串文字 以便我可以将它们重构为常量或类似内容 但是 designer cs 文件充
  • 我可以将 WidgetKit 扩展添加到目标 iOS < 14 的应用程序中吗?

    我想向我的 iOS 应用程序添加一个 WidgetKit 小部件 应用程序本身应保持 14 的设备上可用 但应用程序也应在所有其他设备上运行 这可能吗 是的 您可以 因为我在 iOS13 Xcode 项目上开发小部件 您可以在运行 iOS1
  • Pandas - 如何将样式数据框保存到图像

    我已经设计了数据帧输出的样式 并让它在 Jupyter Notebook 中显示我想要的方式 但我遇到问题 找不到一种将其保存为图像的好方法 我努力了https pypi org project dataframe image https
  • 如何对子目录内的服务进行 GRPC 调用? (在.Net框架中)

    我正在尝试连接到 NetFramework 4 5 Windows 应用程序中的 gRPC 服务 我目前正在使用元包 nuget Grpc 我知道它现在仅处于维护模式 我需要访问不在主机 端口位置但有子路径 子目录的服务 我的服务位于这里
  • 如何知道设备是左横向还是右横向?

    我的应用程序有一个浮动搜索视图 https github com arimorty floatingsearchview占据屏幕的全宽 当方向为横向时 它会位于导航栏后面 因此我想为其添加一些边距 问题是 当我旋转左横向 右侧导航栏 时 浮
  • SQL Server 到 MySQL 数据传输

    我正在尝试将批量数据从 SQL Server 数据库恒定且连续地传输到 MYSQL 数据库 我想使用 SQL Server 的 SSMS 复制 但这显然仅适用于 SQL Server 到 Oracle 或 IBM DB2 的连接 目前 我们
  • Select2:无法创建长度超过 2 个字符的新选项(标签:true)

    我有一个 Select2 框 启用了标记以添加新的自己的标签 选择现有选项 任何长度 都没有任何问题 但有些代码阻止我添加长度超过 2 个字符的新选项 只是无法添加更多字符 请参阅JSFiddle https jsfiddle net rq
  • 预检响应中的 Access-Control-Allow-Methods 不允许方法 DELETE

    我正在尝试发出 DELETE ajax 请求 但似乎无法使其工作 当我使用 POSTMAN 制作它时 它可以工作 这是我的代码 这是我的请求 使用 jQuery 的 ajax 方法发出 ajax url imageUrl type DELE
  • 生成器表达式和生成器函数之间的区别

    生成器表达式和生成器函数之间有什么区别 性能或其他方面 吗 In 1 def f yield from range 4 In 2 def g return i for i in range 4 In 3 f Out 3
  • 如何在 Netbeans 中打开检查器组?

    我使用的是 netbeans ide 7 1 1 所有组都是开放的 我找不到检查组 我打开了导航器组 打开了文件 调色板 程序和导航器组 我需要检查组 问题在于 NetBeans 7 1 1 已将检查器组重命名为 Navigator 以前
  • 在 cookie 中存储和检索 json 对象

    我尝试将 json 对象存储在 cookie 中 但遇到了一些问题 我可以像这样创建我的对象 product name prodname quantity 4 然后我将这个对象保存在我的 cookie 中 随着更多产品的添加 它是一个购物篮
  • 账户之间的 Coinbase 转账返回“未找到”

    我正在尝试在账户之间转移 BTC 和 BCH 通过查看文档 我发现了以下内容 https developers coinbase com api v2 transfer money Between accounts https develo
  • 部署后无法访问 WCF 服务中的 SVC 文件

    我此刻泪流满面 我还能做些什么来排查和分析问题 我已经部署了 WCF 服务层 但无法访问它 在 SVC 文件上传到的同一物理目录中 我还放置了一个静态 HTML 文件 第一行获取该文件 而第二行则抱怨资源被删除 重命名 不可用等 http
  • OSX 10.7.5:致命错误:找不到“ft2build.h”文件

    我正在尝试安装一个名为 ROOT 的程序 http root cern ch drupal content installing root source http root cern ch drupal content installing
  • Cypress - if then 函数

    我对赛普拉斯有疑问 我的页面上有一个元素并不总是出现 什么时候显示 什么时候不显示 没有任何逻辑 在 Cypress 中 是否有一些 IF THEN 函数或其他函数 如何检查元素是否显示 因此填充它 当您没有看到它时 如何跳过该步骤 我的代
  • 子查询连接和where中的可见性差异

    我在简单连接时遇到了问题 SELECT FROM worker wo WHERE EXISTS SELECT wp id working place FROM working place wp JOIN working place work
  • 如何从已完成的“NSURLSessionDataTask”获取数据?

    我知道我可以使用dataTaskWithURL completionHandler 获取completionHandler 块中的数据 但这会阻止委托方法触发 我需要didReceiveData 触发方法 因为这是我配置进度指示器的方式 我