AFNetworking框架的使用和Cocoapods的安装使用

一 AFNetworking框架的使用

AFN框架的内部结构:

+ NSURLSession

1 >AFURLSessionManager
2 >AFHTTPSessionManager(封装了常用的 HTTP 方法)
—-GET;POST;UIKit + AFNetworking 分类;NSProgress :利用KVO

+ 半自动的序列化&反序列化的功能

AFURLRequestSerialization :请求的数据格式/默认是二进制的
AFURLResponseSerialization :响应的数据格式/默认是JSON格式

+ 附加功能

安全策略
—-HTTPS
—-AFSecurityPolicy
网络检测
—-对苹果的网络连接检测做了一个封装
—-AFNetworkReachabilityManager

1 发送请求GET和POST

代码块一:
#pragma mark - 登录(GET)
- (void)get
{
    //创建管理者
    AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];

    //创建字典
    NSDictionary *dictM = @{

                            @"username":@"520it",
                            @"pwd":@"520it",
                            @"type":@"JSON",

                            };

    //发送请求(代码内部完成了OC转JSON)
    /* 第一个参数:请求路径(1.不包含参数 2.? 3. NSString) 第二个参数:字典 第三个参数:progress 进度 第四个参数:success 成功回调 task :请求任务 task.response responseObject:响应体信息(内部已经完成了序列化处理.JSON) 第五个参数:failure 失败的回调 error:错误信息 */
    [sessionManager GET:@"http://120.25.226.186:32812/login" parameters:dictM progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        NSLog(@"%@---%@",[responseObject class],responseObject);

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        NSLog(@"登录失败....");
    }];
}
代码块二:
#pragma mark - 登录(POST)
- (void)post
{
    //创建管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    //创建字典
    NSDictionary *dict = @{
                           @"username":@"520it",
                           @"pwd":@"520it",
                           @"type":@"JSON",
                           };

    //创建task任务
    [manager POST:@"http://120.25.226.186:32812/login" parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        NSLog(@"%@----%@",[responseObject class],responseObject);

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

    }];
}

2 文件下载

需要注意的地方:在使用框架的方法中,方法内部会自动将文件剪切,但是需要我们手动创建一个文件夹,告诉系统将文件剪切到哪个地方.返回一个路径.
具体的代码:
#pragma mark - 下载

- (void)download
{
    //创建会话管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    //确定路径
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_10.mp4"];
    //创建请求对象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    //请求任务
    /* 第一个参数:请求对象 第二个参数:进度回调 downloadProgress(获得进度信息) 第三个参数:destination targetPath:文件的临时存储路径 response:响应头信息 返回值:NSURL(AFN内部已经实现了文件剪切的过程,但是需要我们告诉他应该把文件剪切到哪里) 第四个参数:completionHandler 请求完成的时候调用 response:响应头信息 filePath==fullPath 文件的最终目录 error:错误信息 */
    NSURLSessionDownloadTask *download = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
        //totalUnitCount: 文件的总大小
        //completedUnitCount: 当前下载的数据

        //进度
        NSLog(@"%f",1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);

    } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {

        //告诉系统需要将文件剪切到哪个地方去
        NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];

        return [NSURL fileURLWithPath:fullPath];

    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {

        NSLog(@"下载完成");

    }];

    //执行任务
    [download resume];
}

3 文件上传

注意:需要我们高数系统上传的文件路径;将文件转成二进制数
- (void)upload1
{
    //创建会话管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    //创建执行任务
    //发送POST请求上传文件
    /* 第一个参数:请求路径 NSString 第二个参数:非文件参数 第三个参数:constructingBodyWithBlock 用来拼接要上传的文件数据 第四个参数:progress进度回调 第五个参数:success 上传成功的回调 第六个参数:failure 失败后的回调 */
    [manager POST:@"http://120.25.226.186:32812/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        //需要拼接上传的文件路径
        //UIImage *image = [UIImage imageNamed:@"/Users/xiaofeng/Desktop/Snip20160323_1"];
        //将图片转为二进制数据
        //NSData *data = UIImagePNGRepresentation(image);

        //上传的二进制文件
// [formData appendPartWithFileData:data name:@"file" fileName:@"XFJ-XFJ" mimeType:@"image/png"];

        NSURL *fileUrl = [NSURL fileURLWithPath:@"/Users/xiaofeng/Desktop/Snip20160323_1.png"];

        //上传二进制数据
// [formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"Snip20160323_1.png" mimeType:@"image/png" error:nil];

        //简便方法
        //该方法是简单版本,该方法内部会自动的得到文件的名称以及文件的类型
        [formData appendPartWithFileURL:fileUrl name:@"file" error:nil];

    } progress:^(NSProgress * _Nonnull uploadProgress) {
        //上传的进度
        NSLog(@"%f",1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);

    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        //打印响应体信息
        NSLog(@"%@",responseObject);

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        //文件上传失败的时候调用
        NSLog(@"上传失败.....");
    }];
}

4 AFN的序列化和反序列化

代码块一:返回的数据是oc,因为代码内部已经做了json转oc字典的操作
#pragma mark - 反序列化
//AFN内部默认已经做了(反)序列化处理(JSON)
- (void)json
{
    //创建会话管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    //创建字典
    NSDictionary *dict = @{
                           @"type":@"JSON"
                           };
    //请求任务
    /* 参数一:请求的地址 参数二:字典 参数三:精度 参数四:成功回调 参数五:失败回调 */
    [manager GET:@"http://120.25.226.186:32812/video" parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //打印出响应体信息
        //内部已经把JOSN数据转换层OC对象(字典)
        NSLog(@"%@-----%@",[responseObject class],responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"请求失败...");
    }];
}
代码块二:需要手动将xml转为解析为oc(采用的是代理方法)
#pragma mark - 解析xml数据
//返回的数据是xml,需要我们手动将xml转为oc
- (void)xml
{
    //创建会话管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    //修改响应体信息的解析方式
    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
    //字典
    NSDictionary *dict = @{
                           @"type":@"XML"
                           };

    //发送请求任务
    [manager GET:@"http://120.25.226.186:32812/video" parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //还需要自己手动将xml数据解析为oc字典
        //解析
        NSXMLParser *parser = (NSXMLParser *)responseObject;

        //设置代理
        parser.delegate = self;

        //开始解析
        [parser parse];

        NSLog(@"%@",responseObject);

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

    }];
}
代理方法:
#pragma mark - xml解析的代理数据

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
    NSLog(@"%@-----%@",elementName,attributeDict);
}
代码块三:该种解析数据的方法,对数据不做任何的处理
#pragma mark - 这种解析处理将解析出来的数据不做任何的处理
- (void)httpData
{
    //创建会话管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    //修改数据的解析方式
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    //请求任务
    [manager GET:@"http://120.25.226.186:32812/resources/images/minion_02.png" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //打印解析信息
// NSLog(@"%@-----%@",[responseObject class],responseObject);
        NSLog(@"%@",[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        //解析失败回调
        NSLog(@"解析失败...");
    }];
}
代码块四和代码块三差不多,也是不做任何的处理
- (void)httpData2
{
    //创建会话管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    //修改数据的解析方式
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    //请求任务
    [manager GET:@"http://www.baidu.com" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"%@",[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);
        NSLog(@"%@",[responseObject class]);

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"解析失败....");

    }];
}

5 通过AFN框架来监听网络状态的改变

[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"wifi");
                break;
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"3G|4G");
                break;
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"没有网络");
                break;
            case AFNetworkReachabilityStatusUnknown:
                NSLog(@"未知");
                break;

            default:
                break;
        }
    }];

    //开始监听网络状态改变
    [[AFNetworkReachabilityManager sharedManager] startMonitoring];

二 Cocoapods的安装使用

1.先升级Gem(需要看你mac的版本,如果是10.11以上的就不需要升级)

sudo gem update –system

2.切换cocoapods的数据源

注意:【先删除,再添加,查看】
gem sources – remove https://rubygems.org/
gem sources -a https://ruby.taobao.org/
gem sources -l

3.安装cocoapods

sudo gem install cocoapods
或者(如10.11系统)sudo gem install -n /usr/local/bin cocoapods

4.将Podspec文件托管地址从github切换到国内的oschina(该步骤可以省略)

注意:【先删除,再添加,再更新】
—> pod repo remove master
—> pod repo add master http://git.oschina.net/akuandev/Specs.git
—> pod repo add master https://gitcafe.com/akuandev/Specs.git
—> pod repo update

5.设置pod仓库

—> pod setup

6.测试

注意:【如果有版本号,则说明已经安装成功】
—> pod –version

7.利用cocoapods来安装第三方框架

01 进入要安装框架的项目的.xcodeproj同级文件夹
02 在该文件夹中新建一个文件podfile
03 在文件中告诉cocoapods需要安装的框架信息
—-> a.该框架支持的平台
—-> b.适用的iOS版本
—-> c.框架的名称
—-> d.框架的版本

8.安装

—> pod install –no-repo-update
—> pod update –no-repo-update

9.说明

—> platform :ios, ‘8.0’ 用来设置所有第三方库所支持的iOS最低版本
—> pod ‘SDWebImage’,’~>2.6’ 设置框架的名称和版本号

注意:版本号的规则:

—-> ‘>1.0’ 可以安装任何高于1.0的版本
—-> ‘>=1.0’ 可以安装任何高于或等于1.0的版本
—-> ‘<1.0’ 任何低于1.0的版本
—-> ‘<=1.0’ 任何低于或等于1.0的版本
—-> ‘~>0.1’ 任何高于或等于0.1的版本,但是不包含高于1.0的版本
—-> ‘~>0’ 任何版本,相当于不指定版本,默认采用最新版本号

10.使用pod install命令安装框架后的大致过程:

01 分析依赖:该步骤会分析Podfile,查看不同类库之间的依赖情况。如果有多个类库依赖于同一个类库,但是依赖于不同的版本,那么cocoaPods会自动设置一个兼容的版本。
02 下载依赖:根据分析依赖的结果,下载指定版本的类库到本地项目中。
03 生成Pods项目:创建一个Pods项目专门用来编译和管理第三方框架,CocoaPods会将所需的框架,库等内容添加到项目中,并且进行相应的配置。
04 整合Pods项目:将Pods和项目整合到一个工作空间中,并且设置文件链接。

你可能感兴趣的:(框架,UIKit)