zoukankan      html  css  js  c++  java
  • AFNetworking讲解

      1 #import "ViewController.h"
      2 //#import "AFNetworking/AFNetworking.h"
      3 #import "AFNetworking.h"
      4 
      5 @interface ViewController () {
      6     //进度条
      7     UIProgressView *_progressView;
      8 }
      9 
     10 @end
     11 
     12 @implementation ViewController
     13 
     14 - (void)viewDidLoad {
     15     [super viewDidLoad];
     16 
     17 
     18     /*
     19      数据请求方法
     20      NSURLConnection 系统自带的 常用的网络请求方式
     21      NSURLSession 系统自带的,iOS7.0版本之后出现的,它使用了Block,所以提高了开发效率
     22      AFNetworking 第三方的 目前很多公司经常使用这个第三方,内部集成了NSURLConnection和NSURLSession 环境是ARC,也使用了Block 提高了开发效率,并且不用系统库支持
     23      ASIHttpRequest 第三方 原来经常使用的数据请求库 缺点就是:环境需要MRC,并且没有使用Block,需要进行ARC和MRC之间的转换(混编) 优点:ASI这个第三方库已经没有开发维护,比较成熟,比较稳定,很多开发者对ASI进行了一次Block网络层封装然后调用使用。
     24      
     25      */
     26     
     27     /*
     28      Get请求和Post请求
     29      1.一般get是从服务器上获取数据,post是向服务器传送数据
     30      2.get是把参数列表加到提交表单中的ACTION属性中,值和表单内容各个字段一一对应,在我们的URL中可以看到。POST请求是通过HTTP post机制,将表单的各个字段和其他的内容设置到Html Header里一起传送到ACTION属性指定的URL地址。(说白了用户无法看到此过程)
     31      3.对应的get方式,传送的数据比较小,不能大于2KB.post方式传送的数据比较大,一般被默认为不受限制。但是理论上,IIS4中最大的数据量为80KB II5最大的数据量为100KB
     32      4.get安全性非常低,post安全性非常高。但是执行效率get比post要好
     33      
     34      建议:
     35      get方式安全性比post差,所以建议用post方式提交数据
     36      在做数据查询的时候,建议用get方式,而在做数据的添加、修改或删除的时候,建议post方式
     37     
     38      易语言   汉字 大连人
     39      
     40      */
     41     
     42 //    [self testGet];
     43     
     44 
     45 //    [self testPost];
     46     
     47     
     48 //    [self testNetState];
     49     
     50     //创建进度条
     51     _progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleBar];
     52     //进度条高度不会影响_progressview
     53     _progressView.frame = CGRectMake(10, 100, 300, 20);
     54     _progressView.backgroundColor = [UIColor grayColor];
     55     
     56     [self.view addSubview:_progressView];
     57     
     58     
     59     [self testDownload];
     60     
     61 }
     62 
     63 //5.数据下载
     64 - (void)testDownload {
     65     //网址
     66     NSString *path = @"http://qiteacher.local/share/1.mp4";
     67     
     68     //创建下载的管理者 或者说url会话管理 参数固定写默认配置参数
     69     AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
     70     
     71     //下载任务
     72     NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:path]] progress:^(NSProgress * _Nonnull downloadProgress) {
     73         
     74         //KVO :Key Value Obeserver  观察对象的属性 如果属性值发生了变化 会根据变化响应不同的方法
     75         //键值观察者
     76         
     77         //监听(观察)downloadProgress这个对象的fractionCompleted这个属性
     78         //如果这个属性 新值和旧值不一样就会响应观察者的方法
     79         
     80         [downloadProgress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
     81         
     82         
     83         
     84     } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
     85         //存放具体路径
     86         NSString *path = [NSString stringWithFormat:@"%@/Documents/1.mp4",NSHomeDirectory()];
     87         NSLog(@"%@",path);
     88         //将上面拼接的沙盒路径转换成NSURL类型
     89         return [NSURL fileURLWithPath:path];
     90         
     91     } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
     92         //完成的Block 不管下载成功与否,都会执行到这个block里面
     93         
     94         NSLog(@"下载结束:%@",filePath);
     95         NSLog(@"失败信息:%@",error);  //失败信息如果是空 说明下载成功 否则失败
     96         
     97     }];
     98     
     99     //手动开始下载
    100     [downloadTask resume];
    101     
    102 }
    103 
    104 //观察者执行的方法
    105 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
    106     
    107     NSLog(@"%@",change);
    108     
    109     //取出进度最新的值
    110     CGFloat value = [[change objectForKey:@"new"] floatValue];
    111     
    112     //谨记:线程不能直接对UI进行操作否则会出现假死状态
    113 //    _progressView.progress = value;  //这样写是错误
    114     
    115     //必须在主线程或主队列中进行UI操作
    116     //添加到主队列中 参数1是Block形式
    117     [[NSOperationQueue mainQueue] addOperationWithBlock:^{
    118         
    119         //在此Block里面进行UI操作
    120         
    121         _progressView.progress = value;
    122     }];
    123     
    124 }
    125 
    126 
    127 //4.监测网络状态
    128 - (void)testNetState {
    129  
    130     //网络监测管理者 注意:是单例对象
    131     AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
    132     
    133     //设置网络监测状态改变
    134     [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    135         /*
    136          AFNetworkReachabilityStatusUnknown          = -1, 未知网络
    137          AFNetworkReachabilityStatusNotReachable     = 0,  无网络
    138          AFNetworkReachabilityStatusReachableViaWWAN = 1,  运营商网络 如2G 3G 4G 5G
    139          AFNetworkReachabilityStatusReachableViaWiFi = 2, wifi网络
    140          */
    141         switch (status) {
    142             case AFNetworkReachabilityStatusUnknown:
    143             {
    144                 NSLog(@"未知网络");
    145             }
    146                 break;
    147             case AFNetworkReachabilityStatusNotReachable:
    148             {
    149                 NSLog(@"无网络");
    150             }
    151                 break;
    152             case AFNetworkReachabilityStatusReachableViaWiFi:
    153             {
    154                 NSLog(@"wifi网络");
    155             }
    156                 break;
    157             case AFNetworkReachabilityStatusReachableViaWWAN:
    158             {
    159                 NSLog(@"运营商网络");
    160             }
    161                 break;
    162             
    163             default:
    164                 break;
    165         }
    166     }];
    167     //管理者开始监测网络
    168     [manager startMonitoring];
    169 }
    170 
    171 
    172 //3.用post方式上传图片
    173 - (void)testUploadImageWithPost:(NSString *)m_auth {
    174     
    175     //拿到上传头像的接口
    176     NSString *path = @"http://10.0.8.8/sns/my/upload_headimage.php";
    177     
    178     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    179     //设置content-type
    180     manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
    181     //参数列表 (字典类型)
    182     NSDictionary *paramters = @{@"m_auth":m_auth};
    183     //用post上传图片
    184     /*
    185      第一个参数:接口网址路径
    186      第二个参数:参数列表 (字典类型)
    187      第三个参数:上传图片的block(请求体)
    188      第四个参数:进度block
    189      第五个参数:成功block
    190      第六个参数:失败block
    191      */
    192     [manager POST:path parameters:paramters constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
    193         
    194         //这个Block是上传图片的block或者说上传正文block
    195         //取出文件的路径(在工程中相对)如果打印是绝对路径
    196 //        NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"upload" ofType:@"png"];
    197         
    198         NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"upload2" ofType:@"jpg"];
    199 
    200         /*
    201          第一个参数:原始图片位置的URL
    202          第二个参数:名字:这个名字由后台提供
    203          第三个参数:上传后文件的名字,这个名字不重要(自定义)
    204          第四个参数:MIME类型 这里是PNG格式图片类型 image/png
    205          第五个参数:报错信息
    206          */
    207         
    208         /*
    209          超文本标记语言文本 .html text/html
    210          xml文档 .xml text/xml
    211          XHTML文档 .xhtml application/xhtml+xml
    212          普通文本 .txt text/plain
    213          RTF文本 .rtf application/rtf
    214          PDF文档 .pdf application/pdf
    215          Microsoft Word文件 .word application/msword
    216          PNG图像 .png image/png
    217          GIF图形 .gif image/gif
    218          JPEG图形 .jpeg,.jpg image/jpeg
    219          au声音文件 .au audio/basic
    220          MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
    221          RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
    222          MPEG文件 .mpg,.mpeg video/mpeg
    223          AVI文件 .avi video/x-msvideo
    224          GZIP文件 .gz application/x-gzip
    225          TAR文件 .tar application/x-tar
    226          任意的二进制数据 application/octet-stream
    227          */
    228         [formData appendPartWithFileURL:[NSURL fileURLWithPath:imagePath] name:@"headimage" fileName:@"upload2.jpg" mimeType:@"image/jpeg" error:nil];
    229         
    230     } progress:^(NSProgress * _Nonnull uploadProgress) {
    231         
    232         NSLog(@"进度:%@",uploadProgress);
    233         
    234     } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    235         NSLog(@"上传成功");
    236         
    237     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    238         NSLog(@"上传失败%@",error);
    239         
    240     }];
    241     
    242 }
    243 
    244 
    245 //2.使用post请求数据
    246 - (void)testPost {
    247     //接口网站
    248     NSString *path = @"http://10.0.8.8/sns/my/login.php";
    249     //创建网络请求管理者对象
    250     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    251     //网络传输类型
    252     manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    253     //post请求
    254     //请求参数和get请求类同 但是第二个参数:参数列表根据接口文档而定
    255     [manager POST:path parameters:@{@"username":@"1602qingdao1",@"password":@"woaini"} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    256         NSLog(@"请求登录接口成功");
    257         NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
    258         NSLog(@"%@",dic);
    259         
    260         NSLog(@"message:%@",[dic objectForKey:@"message"]);
    261         
    262         NSString *m_auth = [dic objectForKey:@"m_auth"];
    263         //登录成功后直接上传头像
    264         [self testUploadImageWithPost:m_auth];
    265         
    266         
    267         
    268     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    269         
    270         NSLog(@"请求登录接口失败:%@",error);
    271         
    272     }];
    273     
    274     
    275 }
    276 
    277 //1.使用Get方法请求数据
    278 - (void)testGet {
    279     
    280     //1.拿到网站
    281     NSString *path = @"http://www.weather.com.cn/data/cityinfo/101010100.html";
    282     
    283     //2.创建字一个网络请求管理者对象 (http会话管理者)  此对象不是单例对象
    284     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    285     //3.设置网络传输的类型:这里一般都是二进制
    286     manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    287     //4.设置content-type请求头 (可选)这里表示可以接受的数据类型(text/html)MIME
    288     manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
    289     
    290     //5.get请求
    291     /*
    292      AF的get请求方式
    293      第一个参数:path网址路径 字符串类型
    294      第二个参数:参数列表,这里放入nil 一般get方法都是nil
    295      第三个参数:进度代码块 进度一般在调试的时候用到,通常状况也是nil
    296      第四个参数:成功代码块 请求数据成功后会调用到成功代码块
    297      第五个参数:失败代码块 请求数据失败后回调用到失败代码块
    298      
    299      */
    300     
    301     [manager GET:path parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    302         
    303         NSLog(@"成功");
    304         
    305         NSLog(@"---%@",responseObject);
    306         
    307         //解析
    308         NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
    309         NSLog(@"%@",dic);
    310         
    311         
    312         
    313     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    314         
    315         NSLog(@"失败:%@",error);
    316         
    317         
    318     }];
    319      
    320 }
    321 
    322 @end
  • 相关阅读:
    python学习笔记- day10-4【问题:为什么python的多线程不能利用多核CPU?】
    python学习笔记-day10-3【日志模块logging】
    python学习笔记-day10-2【多进程,多线程】
    python学习笔记-day10-01-【 类的扩展: 重写父类,新式类与经典的区别】
    day12-HTML基础之DOM操作
    day12-HTML基础之CSS
    HTTP原理
    day12-HTML
    day11-Jenkins
    day11-python学习笔记(二十六)yaml,ddt
  • 原文地址:https://www.cnblogs.com/ljcgood66/p/5436129.html
Copyright © 2011-2022 走看看