如何在AFNetworking 2.0中获取下载进度?

2024-01-11

我正在使用 AFURLSessionManager 创建一个新的下载任务:

AFURLSessionManager* manager = ...

NSProgress* p = nil;
NSURLSessionDownloadTask* downloadTask =
        [manager downloadTaskWithRequest:request
                                 progress:&p
                              destination:^NSURL*(NSURL* targetPath, NSURLResponse* response) {...}
                        completionHandler:^(NSURLResponse* response, NSURL* filePath, NSError* error) {...}
        ];
[downloadTask resume];

文件下载正常,但是,如何获得进度通知?

p始终设置为零。我已经提交了一份issue https://github.com/AFNetworking/AFNetworking/issues/1418为了那个原因。

我也尝试过打电话setDownloadTaskDidWriteDataBlock在经理上,我确实收到了进度通知,但我收到的通知全部集中在一起after文件已下载。

看来 AFNetworking 2.0 中这个区域仍然有点 bug

有任何想法吗?


您应该观察fractionCompleted你的财产NSProgress使用 KVO 的对象:

NSURL *url = [NSURL URLWithString:@"http://www.hfrmovies.com/TheHobbitDesolationOfSmaug48fps.mp4"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
NSProgress *progress;
NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
    // …
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
    [progress removeObserver:self forKeyPath:@"fractionCompleted" context:NULL];
    // …
}];

[downloadTask resume];
[progress addObserver:self
            forKeyPath:@"fractionCompleted"
               options:NSKeyValueObservingOptionNew
               context:NULL];

然后添加观察者方法:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"fractionCompleted"]) {
        NSProgress *progress = (NSProgress *)object;
        NSLog(@"Progress… %f", progress.fractionCompleted);
    } else {
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}

当然,你应该检查一下keyPath and/or object参数来决定这是否是您想要观察的对象/属性。

您还可以使用setDownloadTaskDidWriteDataBlock:方法来自AFURLSessionManager(从中AFHTTPSessionManager继承)设置接收下载进度更新的块。

[session setDownloadTaskDidWriteDataBlock:^(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) {
    NSLog(@"Progress… %lld", totalBytesWritten);
}];

此 AFNetworking 方法映射URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:方法来自NSURLSessionDownloadDelegate协议到更方便的块机制。

顺便说一句,苹果的 KVO 实现被严重破坏。我建议使用更好的实现,例如 Mike Ash 提出的MAKVO通知中心 https://github.com/mikeash/MAKVONotificationCenter。如果您有兴趣了解 Apple 的 KVO 被破坏的原因,请阅读正确地进行键值观察 https://mikeash.com/pyblog/key-value-observing-done-right.html作者:迈克·阿什。

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

如何在AFNetworking 2.0中获取下载进度? 的相关文章

  • NSMenuItem、自定义视图和 mouseUp 的奇怪问题:

    我在这里遇到了一个非常非常奇怪的 NSMenu 问题 我使用的大约一半的 NSMenuItems 通过 NSMenuItem 上的 setView 方法具有自定义视图 在此自定义视图中 我实现了 mouseUp 来捕获用户单击菜单项的时间
  • 为什么 GDB 调试器不断冻结 Xcode 4?

    这真是一个奇怪的错误 我正在开发一个使用相机源的 iPhone 项目 并通过 OpenGL 着色器运行它以对其应用效果 然而 每次我在代码中简单地创建一个新的 GLfloat 时 调试器都会在启动时冻结 我无法复制和粘贴文本 因为整个 XC
  • Swift 中 UIImages 的淡入淡出动画

    我有一组图像 我希望它们在登录屏幕的背景中淡出 我无法在 swift 中找到任何可以做到这一点的东西 有什么办法我可以做到吗 这是我当前的代码 override func viewDidLoad super viewDidLoad star
  • 应用未能及时恢复

    我在一个非常具体的场景中遇到 未能及时恢复 崩溃 我认为与看门狗相关 仅在从后台恢复时 并且仅在进入后台后在很短的时间内执行此操作 a最多几秒钟 这似乎是相关的崩溃日志 Incident Identifier E30F2238 5B15 4
  • 如何自动为 Swift 类创建初始化程序?

    UPDATE 使用结构而不是类 struct 在很多方面都更好 它有自己的初始化器 这是我的模型课 是否有可能创建init自动方法 每次我都必须将所有变量一一初始化 这会花费很多时间 class Profile var id String
  • 如何使用 afnetworking 在后台上传任务

    我正在尝试使用 AFNetworking 上传大文件 并在应用程序处于后台时继续上传 我可以很好地上传文件 但是当我尝试使用后台配置时 应用程序崩溃并显示以下堆栈跟踪 异常 EXC BAD ACCESS 代码 1 地址 0x8000001f
  • 获取 Cocoa 中文件的类型

    我成功找到了指定文件的扩展文件类型 JPEG 图像 TIFF 图像等 但我正在寻找更通用的东西 可以对 大类别 中的文件进行分类 如图像 moovies 文本文件等 有没有办法在可可 或 Objective C 中实现这一点 感谢您的帮助
  • UICollectionView 列的垂直偏移

    右图是我试图实现的目标 Does anyone know how I could achieve this on a two column UICollectionView I m able to discern my columns by
  • 是否可以使用 iOS SDK 更改 Amazon Cognito 中的用户名?

    正如标题中所写 是否可以更改 Amazon Cognito 用户的用户名 我在文档中找不到任何内容 可以更新preferred username使用 iOS SDK 的 Cognito 用户 使用updateAttributesAPI 调用
  • 将第 3 方库添加到 iPhone 应用程序时如何设置“标题搜索路径”的路径

    我想添加第 3 方库语音转文本 https github com todoroo iPhone Speech To Textto my Xcode项目 我只是拖xcodeproj文件在我的 iPhone 项目中 然后我按照目标依赖项 将二进
  • Firebase Messaging FCM 在可配置的时间间隔内分发

    当您使用 FCM 向给定应用程序的所有设备发送推送时 这可能会导致许多用户同时打开他们的应用程序 从而导致大量服务器轮询 从而导致负载峰值 有没有一种方便的方法可以在给定的时间间隔内分发消息以进行计划推送 最后 我们找到了一种可能的方法 通
  • 防止 UITableView 滚动到某个点以下

    如何让 UITableView 允许在某个索引行上方滚动 但在低于某个点时阻止滚动 例如 如果我有第 1 行到第 100 行 其中在给定时间视图中仅出现 5 行 我希望允许用户在第 1 50 行之间滚动 但在第 50 行可见时阻止进一步向下
  • 以编程方式添加带有自动布局的 UISLider

    我正在尝试以编程方式将 UISlider 添加到我的视图中 包括约束 以便其宽度适应整个屏幕宽度 这是我到目前为止得到的 2 Add UISlider self slider UISlider alloc init self view ad
  • ios - 使用 SIGPIPE 和 SIG_IGN 的信号函数

    我加入了一个旧项目 我发现了这条线 BOOL application UIApplication application didFinishLaunchingWithOptions NSDictionary launchOptions si
  • Flutter - 删除 ListView 中项目之间的空间

    我正在使用 ListView builder 函数来创建项目列表 然而 iOS 中每个项目之间的空间很大 截图 你知道如何删除项目吗 看来是默认的 因为我没有添加它 code 列表显示 return Scaffold body ListVi
  • 我正在寻找 GCDAsyncUdpSocket 上的一些示例,但发现没有一个有效

    接收数据从未被调用过 我编写了这个由我的主线调用的 swift 类UI视图控制器向接收消息的服务器发送消息 但当服务器发回响应时 客户端永远不会收到它 因为 didReceiveData 从未被触发 我一直在谷歌上搜索并查看文档 它说客户端
  • 如何确定 UINavigationController 中工具栏的高度?

    我有一个带有由 UINavigationController 呈现的工具栏的视图 当我处理 UIKeyboardWillShowNotification 时 我将整个屏幕向上滚动键盘的高度 问题是当显示键盘时 底部工具栏不显示 所以我只需将
  • 后台模式下的 AVSpeechSynthesizer

    我无法获取 iOS 7AVSpeechSynthesizer当我的 iOS 应用程序处于后台模式时工作 我添加了 应用程序播放音频 应用程序支持的后台模式的关键 但我仍然无法让它工作 我还研究了创建一个AVMutableCompositio
  • iOS SDK:MapKit MKPolyLine 未显示

    我试图在地图上显示多段线 但该线没有显示 我尝试了很多事情 但注意到似乎有用 我检查了核心数据函数 它正在返回数据 所以这不是问题 它必须是我在地图点创建或地图上绘制的某个地方 我猜 我确信一定是某个地方出了点小错误 但我找不到它 My c
  • 将我的免费应用程序从 Universal 升级到仅限 iPhone

    我释放我的free app到 appStore 它的版本是 1 0 它是一个Universal app 现在我想发布 1 1 版本到 appStore 我将其升级到iPhone only appStore会拒绝我吗 我已阅读类似的问题 ht

随机推荐

  • Tapestry mixin 究竟是如何工作的?

    我读完后才意识到本文 http tapestry apache org component mixins html我无法向自己解释它是如何工作的以及它可以解决什么问题 是的 它可以用来改变现有组件的行为 但如何限制呢 我能做什么 不能做什么
  • 字典上的 json.dumps,其中键字节为字节

    尝试使用 json dumps 将具有字节类型键的字典对象转换为 json 字典对象的格式事先未知 使用 json dumps 时找到了具有字节值的数组或字典的解决方案 将列表 或字典 中嵌入的字节转换为 str 以与 json dumps
  • OpenCV 2.3 无法编译,未定义的引用错误

    我在 Windows 7 64 位和 Netbeans 7 0 中使用 OpenCV 我尝试使用 MinGW 和 cygwin 编译下一个代码 但都因未定义的引用而失败 当我使用 MAT 或 FLANN 等时 我无法编译 但我添加了所有库
  • WordPress API 按类别获取帖子

    是否可以按类别获取所有帖子 http codex wordpress org XML RPC WordPress API Posts http codex wordpress org XML RPC WordPress API Posts
  • 在身份验证配置中找不到 Pod 执行角色或不具有所有必需的权限。我该如何调试?

    客观的 我希望能够使用 Fargate 部署 AWS EKS 我已经成功地进行了部署node group 然而 当我转而使用 Fargate 时 Pod 似乎都陷入了挂起状态 我当前的代码是什么样的 我正在使用 Terraform 进行配置
  • 在asp.net中发送邮件

    我正在使用 asp net 3 5 和 C 我想从 asp net 发送邮件 因为我从我的托管提供商处获得了一些详细信息 这些是 邮件 MySite net UserName Password 但我无法通过这些详细信息发送邮件 我在 web
  • Oracle TO_DATE 不工作

    我有这个查询不返回任何行 但有些记录的日期大于 90 年 6 月 25 日 为什么它不起作用 SELECT employee id last name hire date FROM employees WHERE hire date gt
  • C- SIGUSR1 在语法上到底是什么

    当我在kill 或signal 函数中使用SIGUSR1时 它在做什么 是宏吗 我读到它是用户定义的 但它是在哪里定义的 我可以制作 SIGUSR10 或以编程方式制作不同信号类型的 数组 吗 用户定义的信号意味着这些信号没有明确的含义 与
  • 使用 apache mod proxy 删除基本身份验证标头

    我有一个 HTTP Basic 安全网站 我用 mod proxy 隐藏了 Tomcat 应用程序服务器 我可以删除 HTTP Basic 标头吗 Tomcat应用程序读取标头并返回401未授权 不需要基本身份验证 因为应用程序使用 coo
  • 如何在 TypeORM 中模拟 EntityManager?

    我有以下代码从我的 NestJS 服务中模拟实体管理器 它在某种程度上有效 但问题在于指定什么findOne应该返回不同的实体 provide getEntityManagerToken useFactory connection Conn
  • R:根据数据框列表中的数据框名称设置列名称

    我有一个很大的数据框列表 如下所示 gt head lst Set1 ID Value 1 A 1 2 B 1 3 C 1 Set2 ID Value 1 A 1 2 D 1 3 E 1 Set3 ID Value 1 B 1 2 C 1
  • 自定义 sp_who 而不授予查看服务器状态

    我需要一个存储过程 可以将其提供给一组用户 使他们能够查看所有正在运行的进程 例如sp who 但我不希望这些用户拥有VIEW SERVER STATE权限 因为这会暴露太多元数据 我还需要允许用户终止进程 这是专门用于该组的开发服务器 我
  • Tinkerpop Gremlin 深度优先搜索顺序

    我有一个非常简单的示例图 我试图对其进行深度优先查询 假设图的边看起来像这样 A gt B A gt C B gt D B gt E C gt F C gt G 从 A 开始的深度优先搜索应该返回 A B D E C F G 但如果我能得到
  • 阻止 CTRL-Click 影响父数据网格

    我有一个 WPF DataGrid 它在 RowDetailsTemplate 中声明了另一个数据网格
  • 使用PIL在App Engine上绘制图像

    我已阅读主题 App Engine PIL 和叠加文本 https stackoverflow com questions 12695480 app engine pil and overlaying text 下面的代码将显示损坏的图像
  • 使用 TFLiteConverter 将 Keras 模型转换为量化的 tflite 版本会导致 NOTYPE 错误

    当转换和执行 keras 模型的 8 位量化时 我遇到了一个奇怪的错误 而图像数据集不会发生这种错误 import tensorflow python keras backend as K import tensorflow as tf f
  • 在向量上查找另一个特定数字之前的数字

    所以我想知道matlab中一个事件何时发生在另一个事件之前 我所说的事件是指数字 例如 我有一个向量 比方说 x 0 3 0 3 0 1 0 2 0 5 0 1 0 3 0 1 0 5 0 1 0 4 0 5 我想知道 0 1 发生在 0
  • 简化嵌套 Maybe 模式匹配

    我的代码中有以下构造 f Maybe A gt X f a case a of Nothing gt x Just b gt case b of Nothing gt y Just c gt case c of Nothing gt z J
  • SpringMVC Ajax 验证

    我有一个 Spring Mvc 3 表单 可以 POST 到控制器 在控制器中我调用来执行 DML 语句 我还有一个单独的验证类 它实现 Validator 并在我的控制器中调用 我在那里进行简单和复杂的验证 例如检查用户名是否存在并返回错
  • 如何在AFNetworking 2.0中获取下载进度?

    我正在使用 AFURLSessionManager 创建一个新的下载任务 AFURLSessionManager manager NSProgress p nil NSURLSessionDownloadTask downloadTask