iOS之AFN框架的使用(文件下载和上传)

AFN

  • 我们在日常开发中,经常使用到网络请求,之前已经简单的说过,网络的概念和请求数据和下载文件
  • 但是在日常开发中,我们一般会使用到 AFNetworking这个框架,请求数据,上传数据,下载数据文件
简单的get和post数据请求
get

 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    /*
     参数一:需要请求的 e网址字符串
     参数二:参数
     参数三: 请求头的设置
     参数四:下载进度
     
    
    */
    [manager GET:@"http://localhost/iOS/demo.json" parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSLog(@"%@",responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"errir:----%@",error);
    }];
    


在这里插入图片描述

POST
 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
 [manager POST:@"网址" parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
    }];
文件下载

参数一: 请求对象
参数二: NSProgress下载进度 completedUnitCount下载的大小 totalUnitCount文件的总大小
参数三: block回调,需要返回一个 存储下载文件的URL地址
参数四: 下载完成时,返回下载文件的地址,就是 参数三 你传的地址


  AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
 
    
    NSURLRequest *requset = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost/video.mp4"]];
    
    //返回一个下载任务对象
    NSURLSessionDownloadTask *loadTask = [manager downloadTaskWithRequest:requset progress:^(NSProgress * _Nonnull downloadProgress) {
        // completedUnitCount 下载的大小
        // totalUnitCount文件的总大小
        NSLog(@"%lld----%lld",downloadProgress.completedUnitCount,downloadProgress.totalUnitCount);
        
    } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
        
        NSString *fullPath =[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject stringByAppendingString:response.suggestedFilename];
        NSLog(@"targetPath-:%@---fullPath:-%@",targetPath,fullPath);
        
        //这个block 需要返回一个目标 地址 存储下载的文件
        return  [NSURL fileURLWithPath:fullPath];
    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
        
        
        NSLog(@"下载完成地址:%@",filePath);
        
    }];
    
    //启动下载任务--开始下载
    [loadTask resume];
文件上传
方式一
 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
    NSURLRequest *requset = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost"]];
    
    UIImage *image = [UIImage imageNamed:@"pic.jpg"];
    NSData *imageData = UIImageJPEGRepresentation(image, 0.8);

    NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:requset fromData:imageData progress:^(NSProgress * _Nonnull uploadProgress) {
        
        NSLog(@"%lld",uploadProgress.completedUnitCount);
        
    } completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
        
        NSLog(@"error:%@",error.description);
        NSLog(@"%@",responseObject);
        
        
    }];
    
   
    
    [uploadTask resume];

方式二

  • 这种方式比较简单,post请求

在上传数据的时候 里面有多重方式

  AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
    //上传数据
    [manager POST:@"http://localhost" parameters:nil headers:nil constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        //上传数据 方式1
        UIImage *image = [UIImage imageNamed:@"pic.jpg"];
        NSData *imageData = UIImageJPEGRepresentation(image, 0.7);
        //要上传的数据 和 上传数据服务器对应的名称
        [formData appendPartWithFormData:imageData name:@"file"];
        
        /*
         方式2
         FileData要上传的数据
         name 服务器规定
         fileName 上传文件的名称
         mimeType类型
         
         */
        [formData appendPartWithFileData:imageData name:@"file" fileName:@"100.jpg" mimeType:@"image/jpg"];
        
        //本地文件的路径 方式3
        NSURL *url = [NSURL fileURLWithPath:@"路径"];
        [formData appendPartWithFileURL:url name:@"file" error:nil];
        
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        //上传进度
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //上传成功的回调
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        //上传失败的回调
    }];

AFN的一些序列化
解析XML数据`
  • 接收到XML数据的时候,responseObject响应的数据类型是NSXMLParser可以参考XML数据解析
 //如果返回数据是XML的时候 记得序列化
    
    AFHTTPSessionManager *manager =  [AFHTTPSessionManager manager];
    
    //设置响应的方式是XML
    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
    
    [manager GET:@"loacst" parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //如果是XML数据 responseObject对应的是NSXMLParser
        NSXMLParser *parser = (NSXMLParser *)responseObject;
        //进行解析
        parser.delegate = self;
        //解析数据
        [parser parse];
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
    }];

数据既不是XML也不是JSON
  • 修改响应的方式为原生的

    
    AFHTTPSessionManager *manager =  [AFHTTPSessionManager manager];
    
    //设置响应的方式  
    manager.responseSerializer =[AFHTTPResponseSerializer serializer];
    
  • 在请求不是AFN规定机械方式的时候 还是错出现一些问题的 比如:text/html的格式
  • 报错码是 Code=-1016, content-type:text/html
  • 默认的解析方式如下
    在这里插入图片描述
  //如果返回数据是XML的时候 记得序列化
    
    AFHTTPSessionManager *manager =  [AFHTTPSessionManager manager];
    
    //修改响应解析 的类型
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"text/json" nil];
网络状态的检测AFNetworkReachabilityManager
//创建管理对象
    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
    
    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        //网络的状态
        /*
         //未知状态
         AFNetworkReachabilityStatusUnknown          = -1,
         //没有网络
         AFNetworkReachabilityStatusNotReachable     = 0,
         //蜂窝
         AFNetworkReachabilityStatusReachableViaWWAN = 1,
         //wifi
         AFNetworkReachabilityStatusReachableViaWiFi = 2,
         
         */
        
        NSLog(@"------%zd",status);
        
        
    }];
    
    //开始监听
    [manager startMonitoring];


  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值