zoukankan      html  css  js  c++  java
  • 第三方类AFNetworking(一)

     

    一、CocoaPods

     

    CocoaPods简介

     

    CocoaPods是一个用来帮助我们管理第三方依赖库的工具

     

    在开发iOS应用时,会经常使用第三方类库,比如SDWeblmage、AFNetworking等等,手动的下载与添加类库非常麻烦,通过CocoaPods可以便捷的下载与管理第三方类库。

     

    使用CocoaPods的目的是让我们能自动化的、集中的、直观的管理第三方开源库。

     

    官方链接:https://cocoapods.org

     

     

    CocoaPods是用Ruby实现的,要想使用它首先需要有Ruby的环境,OS X系统默认支持Ruby运行,但是Ruby的默认源使用的是rubygems.org,过内访问这个网站时,如果无法翻墙,则不能下载,解决方案是将其替换成可用的Ruby,比如淘宝,替换如下:

    打开终端,输入gem sources —remove https://rubygems.org/

     

    再输入gem source - a http://ruby.淘宝.org/

     

     

    为了验证你的Ruby镜像是并且是taobao,可用输入gem sources-|查看

     

     

    CocoaPods安装

     

    终端中输入 sudo gem install cocoa pods (中间可能要输入管理员密码,不是明文,在你输入密码的时候不会提示)

    安装过程需要稍作等待,成功后会有成功安装的提示

     

    在终端中使用cd命令进入工程所在目录。然后在当前目录下使用 vim Podfile命令创建Podfile文件(配文件)。

    键盘输入i进入编辑模式,在podfile文件中输入一下文字

     

    platform :ios, '8.0'

    target "UISenior18_CocoaPodszuoye" do

    pod 'AFNetworking', '~> 3.1.0'

    end

     

     

    在变价完成后,按下esc键,再按下“:”,此时,输入“wq”再按回车,保存退出。

     

    利用CocoaPods下载类库,在终端的当前项目目录下输入pod install 等得一会。

     

    然后回到你的工程所在的目录,会发现现在多了很多文件,此时我们应该使用,xcworkspace文件打开项目,而不再用xcodeproj文件打开。

     

    如果一个项目中已经包含了Cocoapods的配置文件,但是编译却出现错误,那么我们仅需要一行命令就可以配置好所有的第三方类库

    $pod update (更新)

     

    二、AFNetworking

     

    AFNetworking简介

     

    AFNetworking是一个在iOS开发中 使用非常多网络开源库

     

    适用于iOS以及Mac OS X。它构建于在(Apple iOS开发文档)

     

    NSURLConnection , NSOperation,以及其他熟悉的Foundation技术之上

     

    它拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松

     

     

    AFNetworking简介

     

    AFNeting是一个轻量级的网络请求API类库。是以NSURLConnection,NSOperation和其他方法为基础的核心代码:AFHTTPRequestOperationManager

     

    AFNetworking 拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松

     

    AFNetworking是一个轻量级的网络请求API类库。是以NSURLCommection,NSOperation和其他方法为基础的核心代码:AFHTTPRequestOperationManager

    AFnetworking拥有良好的架构,丰富的api,以及模块化架构方式,使得使用起来非常轻松

     

    AFNetworking3.0目前使用NSURLSession作为网络类

     

    AFNetworking简介

    AFNetworking是一个轻量级的网络请求API类库。是以NSURLConection,NSOperation和其他方法为基础的核心代码:AFHTTPRequestOperationManager

     

    AFNetworking拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松

     

    功能梳理一:

    AFRLConnectionOperation:继承自NSOperation实现了NSURL Connection的代理方法。//弃用了

    AFHTTPRequestOperatio:继承自AFURLConnection的子类,当request请求使用的协议为HTTP和HTTPS时使用,它封装了用于决定request是否成功的状态码和内容类型

    AFJSONRequestOperation:继承自AFHTTPRequestOperation,用于下载和处理jsonresponse数据。

    AFPropertyListRequestOperation:继承自AFHTTPRequestOperation,用于下载和处理propretyListresponse数据

    功能梳理二:

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

    1.发起基于根路径的使用基本的url相关路径来只做request

    2.为request自动添加设置http headers。

    3.使用http 基础证书或者OAuth来验证request

    4.为由client制作的requests管理一个NSOperationQueue

    5.从NSDictionary生成一个查询字符串或http bodies。

    6.从request中构建多部件

    7.自动的解析http response数据为相应的表现数据

    8.在网络可达性测试用监控和响应变化。

     

     

    网络监测

    AFNetworking可以进行网络监测

     

    //开始监测

     

     

    [AFNetworkReachabilityManager sharedManager]startMonitoring];

     

    //打印数据

     

    [AFNetworkReachablityManager sharedManager]setReachablityStatuesChangeBlock:^(AFNetworkReachablity status status) {

    NSL(@“%ld”,status)’

    }];

     

    //几种不同的网络状态

     

    typedef NS_ENUM(NSInteger,AFNetworkReachabilityStatus){

            AFNetworkReachabilityStatusUnknown = -1;

    AFNetworkReachabilityStatusNotReachable = 0;

    AFNetworkReachabilityStatusReachableViaWWAN = 1;

    AFNetworkReachabilityStatusReachableViaWiFi = 2;

     

        };

     

     

     

     

    #import "ViewController.h"
    #import <AFNetworking.h>
    
    @interface ViewController ()
    {
        //进行网络监测判断的BOOl值
        BOOL isOpen;
    }
    //用于网络请求的session对象
    @property (nonatomic,strong)AFHTTPSessionManager *session;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        //初始化session对象
        
        self.session = [AFHTTPSessionManager manager];
        //设置请求接口回来的时候支持什么类型的数据
        
        self.session.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"application/x-json",@"text/html", nil];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    - (IBAction)netWorkAction:(id)sender {
        if (!isOpen) {
            //打开网络监测
            [[AFNetworkReachabilityManager sharedManager]startMonitoring];
            isOpen = YES;
            
        }else{
            //关闭网络监测
            
            [[AFNetworkReachabilityManager sharedManager]stopMonitoring];
            isOpen = NO;
            
        }
        
        //接下来会判断当前是wifi状态还是3g状态,网络不可用状态
        
        [[AFNetworkReachabilityManager sharedManager]setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
            switch (status) {
                case AFNetworkReachabilityStatusUnknown:
                    NSLog(@"当前网络处于未知状态");
                    break;
                    
                case AFNetworkReachabilityStatusNotReachable:
                    NSLog(@"当前网络处于未连接状态");
                    break;
                case AFNetworkReachabilityStatusReachableViaWWAN:
                    NSLog(@"当前网络处于无线广域网");
                    break;
                    
                case AFNetworkReachabilityStatusReachableViaWiFi:
                    NSLog(@"当前网络处于wifi状态");
                    
                    break;
                    
                default:
                    break;
                    
            }
            
        }];
    
    }
    
    - (IBAction)getRequestAction:(id)sender {
        //get请求请求的网址
        [self.session GET:@"http://api.yhouse.com/m/city/dynmiclist" parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
            NSLog(@"它是一个下载的进度");
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            NSLog(@"请求成功:%@",responseObject);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"请求失败:");
        }];
    
    }
    - (IBAction)postRequestAction:(id)sender {
        /*{
         do = "pri_memberlist";
         "member_id" = zpHr2dsRvQQxYJxo2;
         "workspace_id" = ILfYpE4Dhs2gWcuQx;
         }*/
        
        
        NSString *urlStr = @"http://m.taskwedo.com/API/wedo1/wedo.php";
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        
        [dict setObject:@"pri_memberlist" forKey:@"do"];
        
        [dict setObject:@"zpHr2dsRvQQxYJxo2" forKey:@"member_id"];
        
        
        [dict setObject:@"ILfYpE4Dhs2gWcuQx" forKey:@"workspace_id"];
        
        [self.session POST:urlStr parameters:dict progress:^(NSProgress * _Nonnull uploadProgress) {
            //
            NSLog(@"上传进度");
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            NSLog(@"post请求成功:%@",responseObject);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"post请求失败");
        }];
    
    }
    
    - (IBAction)post1RequestAction:(id)sender {
        /*
         body体:/*address = "";
         comment = "U7c7bU6a21U5757U8ba1U5212U7528U5230U7b2cU4e09U90e8U5206U4e2dUff0cU5f85U63d0U95eeU3001U56deU7b54U79efU7d2fU5230U4e00U5b9aU6570U91cfU65f6Uff0cU4fbfU4e8eU5927U5bb6U7684U95eeU9898U7684U5febU901fU67e5U627eUff0cU6240U4ee5U63d0U95eeU90e8U5206U6682U65f6U4e0dU52a0U5165U8fd9U4e2a";
         do = "add_comment";
         kind = task;
         "member_id" = zpHr2dsRvQQxYJxo2;
         other = "";
         "task_id" = 55a47e79ec25e3641;*/
        NSString *urlStr = @"http://m.taskwedo.com/API/wedo1/wedo.php";
        
        NSString *comment = @"类模块计划用到第三部分中,待提问、回答积累到一定数量时,便于大家的问题的快速查找,所以提问部分暂时不加入这个";
        
        comment = [comment stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
        
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        
        [dict setObject:@"" forKey:@"address"];
        
        [dict setObject:comment forKey:@"comment"];
        
        [dict setObject:@"add_comment" forKey:@"do"];
        
        [dict setObject:@"task" forKey:@"kind"];
        [dict setObject:@"zpHr2dsRvQQxYJxo2" forKey:@"member_id"];
        [dict setObject:@"" forKey:@"other"];
        
        [dict setObject:@"55a47e79ec25e3641" forKey:@"task_id"];
        
        
        [self.session POST:urlStr parameters:dict progress:^(NSProgress * _Nonnull uploadProgress) {
            NSLog(@"上传");
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            NSLog(@"请求成功:%@",responseObject);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"请求失败");
        }];
    
    }
    
    
    @end
    

      

    注意事项

    AFNetworking可以进行JSON数据解析/Plist数据解析(不支持XML数据解析)

     

    URL字符串中如果有特殊字符或者中文字符,AFNETWorking并没有做UTF8的转码,需要:

    url = 

    [urlStr stringByAddingPercentEncodingWithAllowedCharacters:NSUTF8StringEncoding];

     

    代码实例:

    复制代码
    #pragma mark - POST请求2的响应方法
    - (IBAction)postRequest2Action:(id)sender
    {
        NSString *urlStr = @"http://m.taskwedo.com/API/wedo1/wedo.php";
        
        NSString *commonContent = @"类模块计划用到第三部分中,待提问、回答积累到一定数量时,便于大家的问题的快速查找,所以提问部分暂时不加入这个";
        
        commonContent = [commonContent stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; // 当body体或URL中出现汉字时使用
        
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        [dict setValue:@"" forKey:@"address"];
        [dict setValue:commonContent forKey:@"comment"];
        [dict setValue:@"add_comment" forKey:@"do"];
        [dict setValue:@"task" forKey:@"kind"];
        [dict setValue:@"zpHr2dsRvQQxYJxo2" forKey:@"member_id"];
        [dict setValue:@"" forKey:@"other"];
        [dict setValue:@"55a47e79ec25e3641" forKey:@"task_id"];
        
        [self.session POST:urlStr
                parameters:dict
                  progress:^(NSProgress * _Nonnull uploadProgress) {
                      NSLog(@"上传成功");
                  } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                      NSLog(@"请求成功:%@", responseObject);
                  } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                      NSLog(@"请求失败");
                  }];
    }
    复制代码
  • 相关阅读:
    Ubuntu自启动服务脚本
    坑(一)—— Django ORM 连接超时的坑
    logging模块详解
    端口扫描之nmap命令
    端口扫描之masscan扫描
    端口扫描之Scapy模块的使用
    端口扫描之开放端口扫描方式
    Android Studio导入Project、Module的正确方法
    ImportError: No module named 'requests'
    运行python程序
  • 原文地址:https://www.cnblogs.com/mingjieLove00/p/5535960.html
Copyright © 2011-2022 走看看