• AFN小记


    一、AFN和ASI的区别
    ASI的使用参照文顶顶的
    http://www.cnblogs.com/wendingding/p/3950027.html 

    1.底层实现
    1> AFN的底层基于OC的NSURLConnection和NSURLSession
    2> ASI的底层基于纯C语言的CFNetwork框架
    3> ASI的运行性能 高于 AFN

    2.对服务器返回的数据处理
    1> ASI没有直接提供对服务器数据处理的方式,直接返回datastring
    2> AFN提供了多种对服务器数据处理的方式
    * JSON处理
    * XML处理
    * 其他处理

    3.监听请求的过程
    1> AFN提供了success和failure两个block来监听请求的过程(只能监听成功和失败)
    * success : 请求成功后调用
    * failure : 请求失败后调用

    2> ASI提供了3套方案,每一套方案都能监听请求的完整过程
    (监听请求开始、接收到响应头信息、接受到具体数据、接受完毕、请求失败)
    * 成为代理,遵守协议,实现协议中的代理方法
    * 成为代理,不遵守协议,自定义代理方法
    * 设置block

    4.在文件下载和文件上传的使用难易度
    1> AFN
    * 不容易监听下载进度和上传进度
    * 不容易实现断点续传
    * 一般只用来下载不大的文件

    2> ASI
    * 非常容易实现下载和上传
    * 非常容易监听下载进度和上传进度
    * 非常容易实现断点续传
    * 下载或大或小的文件都行

    5.ASI提供了更多的实用功能
    1> 控制圈圈要不要在请求过程中转     
    2> 可以轻松地设置请求之间的依赖:每一个请求都是一个NSOperation对象
    3> 可以统一管理所有请求(还专门提供了一个叫做ASINetworkQueue来管理所有的请求对象)
    * 暂停恢复取消所有的请求
    * 监听整个队列中所有请求的下载进度和上传进度
    AFN和ASI的对比的参照图
    http://wenku.baidu.com/link?url=PAzbEWzLxF9U499tWk9h_9ekrAr27O3_OeyGYaBUL4K6EbHn3VMYahbEkoIwzXxC3mWfvhCROQmW8uyiXJhWAcct6Y9KATNPHACZfDPt2US

    二.AFN介绍

    1.AFHTTPRequestOperationManager是对NSURLConnection的封装
    以下是AFN内部的原话,所以AFHTTPRequestOperationManager已经过时了,现在大多用AFHTTPSessionManager
    /*
    For developers targeting iOS 6 or Mac OS X 10.8 or earlier,AFHTTPRequestOperationManager` may be used to similar effect.
    要开发 iOS 6 或 Mac OS X 10.8 之前版本,建议使用
    */
    2.AFHTTPSessionManager对NSURLSession的封装

    3.AFN2.0和3.0的比较
    AFN2.0
    .对NSURLSession的封装,
    .对AFURLConnection的封装,
    .对HTTPS网络安全请求做了一个包装,
    .做了一个网络连接管理的一个包装,
    AFN3.0
    添加进度回调
    去掉所有AFURLConnection
    4.AFN功能简介
    AFN 主要用来发送网络请求
    AFNetworkReachabilityManager :用来实时监测当前网络状态的!
    AFSecurityPolicy :安全策略:支持 HTTPS 请求.
    如何在AFN中使用HTTPS的请求参照以下资料
    http://blog.csdn.net/doubleuto/article/details/42154109

    5.AFN发送网络请求时的注意点
    .默认的使用JSON解析器解析JSON数据,返回的默认就是 JSON 解析之后的数据!
    .网络请求成功后默认回到主线程
    .插入数据的格式
    //manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript" ,@"text/plain",nil];
    .发送网络请求里面的参数说明
    // parameters :参数字典
    // progress :进度. AFN 3.0 之后推出的. 没有任何用处!
    // success :成功回调.{成功的要求: 1.网络请求成功; 2.服务器返回的必须是 JSON 数据; 3.自己(AFN)还能够解析 JSON数据}

    6.AFN中解析器的类型,返回的数据类型,所能解析的数据
    要根据服务器返回的数据类型,选择合适的解析器类型!
    // 1. JSON 解析器: JSON 解析之后的数据. ------ JSON
    manager.responseSerializer = [AFJSONResponseSerializer serializer];

    // 2. XML 解析器: NSXMLParser ------ XML/默认是 SAX 解析.
    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
    // 3. 万能解析器: NSData 数据. ----- JSON /XML /HTML /各种文件...
    // 对于文件/图片/视频/网页HTML,只能选择 万能解析器!
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    7.利用AFN检测网络状态的步骤
    . 实例化网络工具监测类.
    . 设置网络状态改变之后的操作.
    .开启网络监测

    三.AFN对文件的上传和下载

    1.文件上传的注意事项
    AFN 只支持单文件上传!默认将后台传回的JSON数据解析成OC的数据类型.

    步骤:
    .拼接本地文件的路径,以file://,注意如果路径中有汉字要用以下方法转义
    stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]
    .发送file请求(同步)获得文件的类型名字(url:统一资源定位符. http:// 网络资源 file://本地资源)
    .AFN发送post请求上传文件
    /*
    - (NSURLSessionDataTask *)POST:(NSString *)URLString
    parameters:(id)parameters
    constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
    success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
    failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
    */
    .constructingBodyWithBlock内封装form表单
    // name: 服务器接收文件参数的 key 值.
    // fileName: 上传文件在服务器中保存的名称.
    // mimeType: 上传文件的文件类型.
    [form appendPartWithFileURL:url name:@"userfile" fileName:@"w" mimeType:response.MIMEType error:NULL];
    注意:通过form表单追加文件是不能实现多文件上传的

    2.AFN实现文件的下载
     
    // 执行下载文件的方法,可以监控下载进度
    - (void)downLoadMonitor
    {
    // 声明一个进度对象
    NSProgress *progress = nil;
    // 1.创建网络管理者
    // AFHTTPSessionManager 基于NSURLSession
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    // 2.利用网络管理者下载数据
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost.video.zip"]];
    /*
    destination
    - targetPath: 系统给我们自动写入的文件路径
    - block的返回值, 要求返回一个URL, 返回的这个URL就是剪切的位置的路径
    completionHandler
    - url :destination返回的URL == block的返回的路径
    */
    /*
    @property int64_t totalUnitCount; 需要下载文件的总大小
    @property int64_t completedUnitCount; 当前已经下载的大小
    */


    NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
    NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename];
    // NSLog(path);
    return [NSURL fileURLWithPath:path];

    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
    NSLog(@"%@",filePath.absoluteString);

    }];

    /*
    要跟踪进度,需要使用 NSProgress,是在 iOS 7.0 推出的,专门用来跟踪进度的类!
    NSProgress只是一个对象!如何跟踪进度!-> KVO 对属性变化的监听!
    @property int64_t totalUnitCount; 总单位数
    @property int64_t completedUnitCount; 完成单位数
    */
    // 给Progress添加监听 KVO
    // [progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil];

    // 3.启动任务
    [downTask resume];

    }

    下面是使用KVO监听下载进度
     

    // 执行下载文件的方法,可以监控下载进度
    - (void)downLoadMonitor
    {
    // 声明一个进度对象
    NSProgress *progress = nil;
    // 1.创建网络管理者
    // AFHTTPSessionManager 基于NSURLSession
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    // 2.利用网络管理者下载数据
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost.video.zip"]];
    /*
    destination
    - targetPath: 系统给我们自动写入的文件路径
    - block的返回值, 要求返回一个URL, 返回的这个URL就是剪切的位置的路径
    completionHandler
    - url :destination返回的URL == block的返回的路径
    */
    /*
    @property int64_t totalUnitCount; 需要下载文件的总大小
    @property int64_t completedUnitCount; 当前已经下载的大小
    */


    NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
    NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename];
    // NSLog(path);
    return [NSURL fileURLWithPath:path];

    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
    NSLog(@"%@",filePath.absoluteString);

    }];

    /*
    要跟踪进度,需要使用 NSProgress,是在 iOS 7.0 推出的,专门用来跟踪进度的类!
    NSProgress只是一个对象!如何跟踪进度!-> KVO 对属性变化的监听!
    @property int64_t totalUnitCount; 总单位数
    @property int64_t completedUnitCount; 完成单位数
    */
    // 给Progress添加监听 KVO
    // [progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil];

    // 3.启动任务
    [downTask resume];

    }












  • 相关阅读:
    web----DNS解析
    iToken----开发前准备
    web----计算机网络通讯
    SpringCloud----基础
    微服务----理解
    微服务----docker-compose.yml属性详解
    微服务----一次构建,到处运行
    Linux----安装gcc
    微服务----Registry
    Linux----常用命令
  • 原文地址:https://www.cnblogs.com/devChang/p/5590074.html
Copyright © 2020-2023  润新知