网络程序员

AFN的基本使用(上传和下载)

2016-06-06  本文已影响2376人  CoderJyq

1.使用AFN上传数据

1,创建会话管理者对象

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

2,发送POST请求上传

//非文件参数
NSDictionary *dict = @{@"username":@"jyq"};
/*
     第一个参数:请求路径
     第二个参数:非文件参数 username(参数名) (传NSDictionary)
     第三个参数:constructingBodyWithBlock 在该block中告诉AFN要上传的文件数据信息
     第四个参数:progress 进度回调
     第五个参数:success 成功后的回调
     第六个参数:failure 失败后的回调
*/
[manager POST:@"http://xxx" parameters:dict constructingBodyWithBlock:
^(id<AFMultipartFormData>  _Nonnull formData) {
        /*
         第一个参数:文件的URL路径
         第二个参数:参数名称 file
         第三个参数:在服务器上的名称
         第四个参数:文件的类型
         */
        [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/User/Desktop/屏幕快照 2016-03-28 下午11.35.03.png"] 
name:@"file" fileName:@"123.png" mimeType:@"image/png" error:nil];

    } progress:^(NSProgress * _Nonnull uploadProgress) {
        
        //计算文件的上传进度
        NSLog(@"%f",1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        //responseObject 响应体信息(默认已经完成了JSON的解析,是一个OC对象)
        NSLog(@"上传成功---%@",responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"上传失败---%@",error);
    }];

2.使用AFN下载数据

1,创建会话管理者对象

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

2,创建请求对象

NSURL *url = [NSURL URLWithString:@"http://xxx"];
    
NSURLRequest *request = [NSURLRequest requestWithURL:url];

3,发送POST请求上传

/*
     第一个参数:请求对象
     第二个参数:progress 进度回调
     第三个参数:destination--(downloadTask-)
        在该block中告诉AFN应该把文件存放在什么位置,AFN内部会自动的完成文件的剪切处理
        targetPath:文件的临时存储路径(tmp)
        response:响应头信息
        返回值:文件的最终存储路径
     第四个参数:completionHandler 完成之后的回调
     filePath:文件路径 == 返回值
*/
    NSURLSessionDownloadTask *download = [manager downloadTaskWithRequest:request progress:
    ^(NSProgress * _Nonnull downloadProgress) {
        
        //进度回调,可在此监听下载进度(已经下载的大小/文件总大小)
        NSLog(@"%f",1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
        
    } destination:^NSURL * _Nonnull(NSURL * _Nonnull 
    targetPath, NSURLResponse * _Nonnull response) {
        
        NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, 
NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
        
        NSLog(@"targetPath:%@",targetPath);
        NSLog(@"fullPath:%@",fullPath);
        
        return [NSURL fileURLWithPath:fullPath];
        
    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, 
    NSError * _Nullable error) {
        
        NSLog(@"filePath:%@",filePath);
        
    }];
    
    [download resume];

补充:AFN可以使用KVO监听方法, 可监听下载进度等

[download addObserver:<#(nonnull NSObject *)#> forKeyPath:<#(nonnull NSString *)#> options:<#(NSKeyValueObservingOptions)#> context:<#(nullable void *)#>]
上一篇 下一篇

猜你喜欢

热点阅读