zoukankan      html  css  js  c++  java
  • AFNetworking你最最最起码要知道的基本使用~

    • AFNetworking是一个在iOS开发中,使用非常多的一个开源库
    • 适用于iOS以及Mac OS X, 它构建于在(Apple iOS开发文档)NSURLConnection, NSOperation,以及其他熟悉的Foundation技术之上
    • 官方链接 http://cocoadocs.org/docsets/AFNetworking/1.3.0/
    • 核心代码:AFHTTPRequestOperationManager
    • AFNetworking3.0目前使用NSURLSession作为网络类

    CORE(核心):

    • AFURLConnectionOperation : 继承自NSOperation实现了NSURLConnection的代理方法
    • AFHTTPRequestOperation : 继承自AFURLConnectionOperation的子类,当request请求使用的协议为HTTP和HTTPS时使用,它封装了用户决定request是否成功的状态码和内容类型
    • AFJSONRequestOperation : 继承自AFHTTPRequestOperation,用户下载和处理json response数据
    • AFXMLRequestOperation : 继承自AFHTTPRequestOperation,用于下载和处理xml response数据
    • AFPropertyListRequestOperation : 继承自AFHTTPRequestOperation,用户下载和处理property list response数据

    HTTP CLIENT :

    AFHTTPClient : 是一个封装了基于http协议的网络应用程序的公共交流模式

    • 发起基于根路径的使用基本的url相关路径来只做request
    • 为request自动添加http headers
    • 使用http基础整数或者OAuth来验证request
    • 为由client只做的erequest管理一个NSOperationQueue
    • 从NSDictionary省城一个查询字符串或http bodies
    • 从request中构建多部件
    • 自动的解析http response数据为响应的表现数据
    • 在网络可达性测试监控和响应变化

    IMAGES

    • AFImageRequestOperation : 一个AFHTTPRequestOperation的子类,用于下载和处理图片
    • UIImageView+AFNetworking : 添加一些方法UIImageView中, 为了从一个URL中异步加载远程图片

    注意事项 :

    • AFNetworking可以进行JSON数据解析/plist数据解析(不支持XML数据解析)
    • URL字符串中如果有特殊字符或者中文字符,AFNetworking并没有UTF8,需要 url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    示例代码 :

    get请求:

    //GET请求
    - (void)afGetMethod {
        //网络请求的核心类,http请求的会话管理对象
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        //设置响应数据的格式
        //AFHTTPResponseSerializer 返回的数据类型为二进制类型
        //AFJSONResponseSerializer 返回数据类型为json类型
        //AFXMLParserResponseSerializer xml类型
        manager.responseSerializer = [AFHTTPResponseSerializer serializer];
        //get请求
        //第一个参数:请求网址
        //第二个参数:请求参数
        //第三个参数:下载进度
        //第四个参数:请求成功的block回调
        //第五个参数:数据请求失败
        [manager GET:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    //        NSLog(@"----------%@",responseObject);//所需要的数据
            NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
            NSData *data = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
            NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"%@",str);
            NSLog(@"%@",[NSThread currentThread]);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"请求失败");
        }];
    }

    post请求:

    //post请求
    - (void)afPostMethd {
        //会话管理对象
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        //设置返回数据的格式
        manager.responseSerializer = [AFHTTPResponseSerializer serializer];
        //转义字符
    //    NSString *dict1 = @"{\"data\":20151031,\"startRecord\":1,\"len\":5,\"udid\":1234567890,\"terminalType\":\"Iphone\",\"cid\":213}";
        NSDictionary *dict = @{@"data":@"20151031",@"startRecord":@"1",@"len":@"5",@"udid":@"1234567890",@"terminalType":@"Iphone",@"cid":@"213"};
    
        //对象类型转json串
    //    NSData *strData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];
    //    NSString *jsonStr = [[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding];
    //    NSLog(@"%%");
        //constructingBodyWithBlock:在此block种可以为上传的参数添加(拼接)新的需要的上传的数据,适用于上传给服务器的数据流比较大的时候
        //af中一般post请求的参数都为字典类型
    
        [manager POST:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx" parameters:dict constructingBodyWithBlock:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
            NSData *data = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
            NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"-------------***%@",str);
            NSLog(@"%@",[NSThread currentThread]);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"请求失败");
        }];
    
    }

    网络监测 :

    • 通常写在AppDelegate.m文件中,通过通知,在其他ViewController中创建观察者对其status进行观察

    AppDelegate.m文件中

        AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
        //开始监测
        [manager startMonitoring];
        //网络状态的返回
        [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
            //当网络发生变化的时候,我们发送通知,告知需要此消息的对象
            [[NSNotificationCenter defaultCenter] postNotificationName:kNetStatus object:@(status)];
        }];

    ViewController.m文件中

     //添加一个观察者,观察网络的变化
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(netChange:) name:kNetStatus object:nil];
    
    //通知的回调方法
    - (void)netChange:(NSNotification*)notification {
        //取出网络状态
        AFNetworkReachabilityStatus status = [notification.object intValue];
                switch (status) {
                    case AFNetworkReachabilityStatusUnknown:
                        NSLog(@"未知状态");
                        break;
                    case AFNetworkReachabilityStatusNotReachable:
                        NSLog(@"无网络连接");
                        break;
                    case AFNetworkReachabilityStatusReachableViaWWAN:
                        NSLog(@"3G/4G");
                        break;
                    case AFNetworkReachabilityStatusReachableViaWiFi:
                        NSLog(@"WiFi");
                        break;
                    default:
                        break;
                }
    }

    上传与下载

    #pragma mark - 上传
    //有两种方式
    //第一种方法是通过工程中的文件进行上传
    - (void)upLoad1 {
        //1.创建管理者对象
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        //2.上传文件
        NSDictionary *dict = @{@"username":@"1234"};
        //上传至哪个url
        NSString *url = @"1235466";
        [manager POST:url parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
            //上传文件参数
            UIImage *image = [UIImage imageNamed:@"4.png"];
            NSData *data = UIImagePNGRepresentation(image);
            //这个就是参数
            [formData appendPartWithFileData:data name:@"file" fileName:@"4.png" mimeType:@"image/png"];
        } progress:^(NSProgress * _Nonnull uploadProgress) {
            //打印上传进度
            NSLog(@"%lf",1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            NSLog(@"请求成功");
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"请求失败");
        }];
    }
    
    //第二种:是通过url来获取路径,进入沙盒或者系统相册等等
    - (void)upload2 {
        //1.创建管理者对象
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        //2.上传文件
        NSDictionary *dic = @{@"userName":@"123456"};
    
        NSString *urlString = @"456789";
        [manager POST:urlString parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
            [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"文件地址"] name:@"fileName" error:nil];
        } progress:^(NSProgress * _Nonnull uploadProgress) {
            NSLog(@"%lf",1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            NSLog(@"请求成功: %@",responseObject);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"请求失败: %@",error);
        }];
    }
    #pragma mark - 下载
    - (void)downLoad {
        //1.创建管理者对象
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        //2.确定请求的URL地址
        NSURL *url = [NSURL URLWithString:@""];
        //3.创建请求对象
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
        //下载任务
        NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
            //打印下载进度
            NSLog(@"%lf",1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
        } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
            //下载地址
            NSLog(@"默认下载地址 : %@",targetPath);
            //设置下载路径,通过沙盒获取缓存地址,最后返回NSURL对象
            NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
            return [NSURL URLWithString:filePath];
        } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
            //下载完成调用的方法
            NSLog(@"下载完成");
            NSLog(@"%@--%@",response,filePath);
        }];
        //开始启动任务
        [task resume];
    }
  • 相关阅读:
    Mac 下 IDEA 无法启动的问题
    oracle impdp
    张亚琴:人生是赛场不是战场,人生是一个没有终点的赛场,永远都在起跑线上
    sc抽象组件工作
    Jenkins 实现gitLab提交代码立即利用Jenkins发版
    Jenkins 修改admin密码
    docker 安装nginx,并配置vue项目在nginx启动
    No 'Access-Control-Allow-Origin' header is present on the requested resource 是跨域的问题吗?
    Vue个别vue文件不能热加载
    IVT虚拟化支持
  • 原文地址:https://www.cnblogs.com/xjy-123/p/6640025.html
Copyright © 2011-2022 走看看