社区首页 >问答首页 >iOS 8-在恢复任务之前由NSURLSessionDownloadTask创建的fractionCompleted = 1.0的NSProgress对象

iOS 8-在恢复任务之前由NSURLSessionDownloadTask创建的fractionCompleted = 1.0的NSProgress对象
EN

Stack Overflow用户
提问于 2014-09-11 12:09:10
回答 1查看 1.7K关注 0票数 2

我有一个NSProgress对象树来监视涉及下载文件的数据处理。下载使用后台配置的NSURLSession完成。

当我开始这个过程时,最上面的NSProgress对象报告了意外的fractionCompleted数字。调试了这个问题(并将其隔离到一个"Hello World“应用程序中)后,我发现调用NSURLSession downloadTaskWithRequest:后创建了一个NSProgress对象,并且在调用上面的方法之后,它的fractionCompleted属性为1.0。因为这个NSProgress对象获取我的NSProgress树的一部分,所以如果偏移树中它上面的进度数字。

在这个示例应用程序中,我还启动了一个与下载并行的虚拟后台任务,该任务通过一个NSProgress对象报告进度。我这样做的原因是,如果NSURLSession不创建任何NSProgress对象(这是苹果公司声称的),那么NSProgress树中仍然会有至少一个对象。

在启动下载和虚拟任务之后立即记录了NSProgress树,下面是NSProgress树的样子:

代码语言:javascript
代码运行次数:0
复制
<NSProgress: 0x7ff8dae06b10> : Parent: 0x0 / Fraction completed: 0.5000 / Completed: 0 of 1  
  <_NSProgressGroup: 0x7ff8dae0f450> : Portion of parent: 1 Children: 1
    <NSProgress: 0x7ff8dae0f880> : Parent: 0x7ff8dae06b10 / Fraction completed: 0.5000 / Completed: 0 of 100  
      <_NSProgressGroup: 0x7ff8dae0fec0> : Portion of parent: 100 Children: 2
        <NSProgress: 0x7ff8dad74b90> : Parent: 0x7ff8dae0f880 / Fraction completed: 1.0000 / Completed: 1 of 1  
        <NSProgress: 0x7ff8daf036c0> : Parent: 0x7ff8dae0f880 / Fraction completed: 0.0000 / Completed: 0 of 100

因此,进度报告变得很奇怪。

如果我注释掉启动下载的调用(self resumeDownload),那么NSProgress树如下所示:

代码语言:javascript
代码运行次数:0
复制
<NSProgress: 0x7febca52ac90> : Parent: 0x0 / Fraction completed: 0.0000 / Completed: 0 of 1  
  <_NSProgressGroup: 0x7febca529e60> : Portion of parent: 1 Children: 1
    <NSProgress: 0x7febca529ff0> : Parent: 0x7febca52ac90 / Fraction completed: 0.0000 / Completed: 0 of 100  
      <_NSProgressGroup: 0x7febca52ced0> : Portion of parent: 100 Children: 1
        <NSProgress: 0x7febca52d780> : Parent: 0x7febca529ff0 / Fraction completed: 0.0000 / Completed: 0 of 100

正如您所看到的,fractionCompleted = 1.0没有额外的NSProgress对象,并且进度报告是正常的。

现在,我看不出fractionCompleted = 1.0的NSProgress是从哪里来的,如果它不是来自NSURLSession或下面的什么东西。(苹果声明,NSURLSession不会创建NSProgress对象。)我在iOS 7上看不到这种行为,只在iOS 8上(即使是GM版本)。

请注意,我使用的是带后台配置的NSURLSession!使用默认配置时,不会出现问题。

为什么这个“意外的”NSProgress对象在fractionCompleted = 1.0时出现?我是否使用了错误的NSProgress应用程序接口?是什么导致了iOS 7和8上截然不同的行为?

这里提供了示例代码:https://s3-eu-west-1.amazonaws.com/pg.test/pubtest/NSProgress-20140830.zip

提前感谢您的帮助。

EN

回答 1

Stack Overflow用户

发布于 2014-10-03 16:15:12

我们在上传进度时遇到了同样的问题。正如您所说的,创建任务的调用看起来是在创建一个NSProgress对象,该对象绑定到当前进度并立即完成。

代码语言:javascript
代码运行次数:0
复制
uploadTask = [self.session uploadTaskWithRequest:request fromFile:fileURL];

这给我们的整体进度带来了问题。我们在我们的AFNetworking分支中创建了一个变通方法,以便有一个通过块创建NSProgress的回调。AFURLSessionManager中的方法已更新为具有进度创建块,而不是进度输出参数。

代码语言:javascript
代码运行次数:0
复制
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
                                     fromFile:(NSURL *)fileURL
                                 progress:(NSProgress *(^)(int64_t totalUnitCount))progressCreationBlock
                            completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler

这确保了只有在" progress“块中创建的progress对象才会被添加为当前进程的直接子进程,而不是创建会话的进程。然后,来自被调用者的块的实现将如下所示:

代码语言:javascript
代码运行次数:0
复制
progress:^NSProgress *(int64_t totalUnitCount) {
    [currentProgress becomeCurrentWithPendingUnitCount:1];

    NSProgress *progress = [NSProgress progressWithTotalUnitCount:totalUnitCount];

    [currentProgress resignCurrent];

    return progress;
} 

https://github.com/cgreen-mmf/AFNetworking/commit/a0703a4f82a47e6c56c11245e4d88846ffbd0b28

我不清楚这是不是iOS 8中的一个错误,或者这是否是预期的行为。

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

https://stackoverflow.com/questions/25787103

复制
相关文章
jQuery练习——下拉菜单
实现效果:当鼠标移到不同的一级菜单,会显示相应的二级菜单,鼠标移走,二级菜单消失。
颜颜yan_
2022/12/01
27K0
jQuery练习——下拉菜单
jQuery下拉菜单经典案例
jQuery下拉菜单经典案例  源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <
红目香薰
2022/11/29
11.1K0
jQuery下拉菜单经典案例
javascript下拉菜单代码(用jquery做下拉菜单)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/126047.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/01
11.4K0
javascript下拉菜单代码(用jquery做下拉菜单)
jQuery 动态绑定
这是在项目过程中所遇到的一个问题,给 JS 动态生成的元素绑定事件失效,代码如下所示:
Nian糕
2018/08/21
2K0
jQuery 动态绑定
jquery事件绑定
.bind()   为一个元素绑定一个元素处理程序。   .bind(eventType[,eventData],handler(eventObject))     eventType       一个包含一个或多个DOM事件类型的字符串,或自定义事件的名称。     eventData       一个对象,它包含的数据键值对映射将被传递给事件处理程序。     handler(eventObject)       每当事件
用户1197315
2018/01/19
3.6K0
jQuery预绑定
文章作者:Tyan 博客:noahsnail.com  |  CSDN  |  简书
Tyan
2022/05/09
5670
jquery 绑定click事件
有时候需要获得匹配元素相对于其同胞元素的索引位置,此时可以用index()方法获取
Devops海洋的渔夫
2019/05/30
4.5K0
jQuery on绑定事件问题
以前没注意,最近在使用on绑定事件时发现,通过for循环绑定动态绑定时,多个元素最终绑定的都是最后一次事件,不知道用while是不是也是一样,谁有清楚这种现象也可以说一下原因!!!
sucl
2019/08/07
2.5K0
jQuery简单实现二级下拉菜单
下拉菜单原理:滑过一级的li才让第二层的li显示,利用jq简单的抓取元素,让一级下的二级li显示就能解决,使用jq比css的思路更加明确!
十月梦想
2018/08/29
4.3K0
jquery 使用 unbind 解决重复绑定执行事件
在jquery监听click事件的时候会出现点击一次没有重复,点击第二次就重复的情况。出现这个问题的原因是之前的click事件被绑定后,并没有解绑。
Devops海洋的渔夫
2019/08/02
1.6K0
jquery绑定事件的坑,重复绑定问题
我实现点击table表格中的删除按钮,找到当前按钮的祖先元素tr 然后删除该行,但是我首先点击删除的时候要先弹出提示框,是否要下载,这时在点击删除按钮删除,之前没有考虑到事件重复绑定问题,所以每次点击删除的时候就会多选择几行,之后选择的越来越多,经过网友解答,成功解决,先把重复绑定的删除的click事件解绑再继续绑定,就没问题。
蓓蕾心晴
2018/07/24
2.4K0
第72天:jQuery实现下拉菜单
1、块元素居中:给块元素本身设置:margin:0 auto;,块元素必须设置宽度
半指温柔乐
2018/09/11
1.9K0
JQuery 事件绑定不生效
一个同时问我,JQuery事件绑定为什么不生效,最好通过查找,发现了问题。 一般而言,JQuery事件绑定不生效,是一些新手经常遇到的问题,其实都是简单的问题,大概分两种情况。 先上代码,以下两个button的事件绑定都不生效。
用户3158888
2019/05/29
2.6K0
Jquery获取DOM绑定事件
获取到当前正在执行的事件: $('#testDive').bind('click', function(event){alert('event: ' + event.type)}); 获取所有绑定事件: $._data(document.getElementById('testDive'), 'events');
就只是小茗
2018/10/10
2.2K0
jquery 绑定回车(Enter )事件
如果想模拟Tab键,只要写成 if (window.event.keyCode==13) window.event.keyCode=9 就行了,它会跳到另一个元素上。
Yiiven
2022/12/15
2.8K0
js_jQuery【下拉菜单联动dom操作】
下拉菜单联动dom操作案例  源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </hea
红目香薰
2022/11/29
14.1K0
js_jQuery【下拉菜单联动dom操作】
使用 jQuery 对下拉菜单 SELCET 进行增加、删除和修改的操作
jQuery 获取下拉菜单 SELECT 选择的 Text 和 Value: //获取Select选择的Text var checkText=jQuery("#select_id").find("option:selected").text(); //获取Select选择的option Value var checkValue=jQuery("#select_id").val(); //获取Select选择的索引值 var checkIndex=jQuery("#select_id ").get(
Denis
2023/04/15
1.3K0
jQuery 事件绑定 和 JavaScript 原生事件绑定
jQuery 中提供了四种事件监听绑定方式,分别是 bind、live、delegate、on,
Krry
2018/09/10
5.7K0
jQuery 事件绑定 和 JavaScript 原生事件绑定
使用jQuery.data()查看元素上绑定的事件
最近遇到一个诡异的问题,发现我添加在一个HTMLElement片段上面的事件绑定,会在后续的流程中,无故丢失了。但是,我不知道它是什么时候丢失的。
libo1106
2018/08/08
1.9K0
前端基础-jQuery简单事件绑定
第4章 简单事件绑定 所有事件在jquery中都是jquery对象的方法 click(handler) 单击事件 mouseover(handler) 鼠标悬浮事件 mouseout(handler) 鼠标离开事件 ... <input type="button" value="我是一个按钮" id="btn"> <script> $(function(){ $('#btn').click(function(){ alert("来了老弟~"); }
cwl_java
2020/03/26
6900

相似问题

使用jquery重新绑定Kendo下拉菜单

20

无法绑定jquery下拉菜单

10

在ruby on rails中使用jQuery绑定下拉菜单

10

使用jquery绑定或重新加载Select 2下拉菜单

20

在asp.net中使用下拉菜单绑定图像的jQuery

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文