第三方类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(@"请求失败");
              }];
}
复制代码
原文地址:https://www.cnblogs.com/mingjieLove00/p/5535960.html