公司旧项目的网络请求类是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];
}
}
网友评论