美文网首页AFNetworking
AFNetworking 2.5文件上传显示进度条

AFNetworking 2.5文件上传显示进度条

作者: jzhang | 来源:发表于2016-06-16 15:55 被阅读783次

    公司旧项目的网络请求类是afn 2.5版本的,在做文件上传的时候发现没有实时获取进度的那个自带方法,需要手动添加。

        AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
        
        NSProgress *progress = nil;
        //2.5版本的afn这里progress只传入一个对象的地址,不像后来的版本是个block可以获取进度
        NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
            if (error) {
                [IBTLoadingView hideHUDWithText:nil];
                NSLog(@"Error: %@", error);
                fail(error);
            } else {
                [IBTLoadingView hideHUDWithText:nil];
                NSLog(@"%@ %@", response, responseObject);
                succ(responseObject);
            }
        }];
        [uploadTask resume];
        //1. 添加观察者,监视进度条变化。 progress的fractionCompleted属性就是当前的进度
        [progress addObserver:self
                   forKeyPath:@"fractionCompleted"
                      options:NSKeyValueObservingOptionNew
                      context:NULL];
    

    调用观察者的方法
    我们假设当前类(在例子中为UITableViewController)还有父类,并且父类也有自己绑定了一些其他KVO呢?我们看到,上述回调函数体中只有一个判断,如果这个if不成立,这次KVO事件的触发就会到此中断了。但事实上,若当前类无法捕捉到这个KVO,那很有可能是在他的superClass,或者super-superClass...中,上述处理砍断了这个链。合理的处理方式应该是这样的

    #pragma mark - 拿到文件上传进度
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
        //拿到进度
        if ([keyPath isEqualToString:@"fractionCompleted"] && [object isKindOfClass:[NSProgress class]]) {
            NSProgress *progress = (NSProgress *)object;
            NSLog(@"Progress is %f", progress.fractionCompleted);
            //进度到1的时候说明加载完成了,移除观察者
            //不知道这么写对不对,有人发现不对请指出来,非常感谢~
            if (progress.fractionCompleted == 1) {
                [progress removeObserver:self forKeyPath:@"fractionCompleted"];
            }
        }else{
             [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
        }
        
    }
    

    相关文章

      网友评论

      本文标题:AFNetworking 2.5文件上传显示进度条

      本文链接:https://www.haomeiwen.com/subject/imvmdttx.html