AFNetworking

AFNetworking 2.5文件上传显示进度条

2016-06-16  本文已影响783人  jzhang

公司旧项目的网络请求类是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];
    }
    
}
上一篇下一篇

猜你喜欢

热点阅读