AFN基本使用

AFN基本使用

简介

  • 框架结构
    • NSURLSession
      • NSURLSessionManager对NSURLSession的封装
      • AFHTTPSessionManager会话管理者
    • 序列化处理Serialization
      • AFURLRequestSerilization请求
      • AFURLResponseSerilization响应
    • 扩展功能
      • AFSecurityPolicy安全
      • AFNetworkReachabilityManager监听
    • UIKit+AFNetworking
      • 下载缓存图片UIImageView+AFNetworking
        • 思考:这个和SDWebImage有什么区别呢?
      • 很多好用的分类

GET请求

  • 创建会话管理者
    • [AFHTTPSessionManager manager]
  • 创建字典保存参数
  • 发送请求
    • [manager GET:parameters:progress:{}success:{}failure:^{}]
      • 参数一:请求路径不包含参数,类型是NSString
      • 参数二:参数,用字典保存参数
      • 参数三:进度回调,发送GET请求不需要进度信息,nil
      • 参数四:网络请求成功之后的回调
        • dataTask:请求任务本身
          • task.response是响应头
        • responseObject:不是响应头,是响应体,内部已经完成了反序列化处理 (已经把JSON转为了OC对象了)
      • 参数五:网络请求失败之后的回调
        • task:请求任务
        • error:错误信息

POST请求

  • 创建会话管理者
    • [AFHTTPSessionManager manager]
  • 创建字典保存参数
  • 发送请求
    • [manager POST:parameters:progress:{}success:{}failure:^{}]
      • 参数一:请求路径不包含参数,类型是NSString
      • 参数二:参数,用字典保存参数
      • 参数三:进度回调,发送GET请求不需要进度信息,nil
      • 参数四:网络请求成功之后的回调
        • dataTask:请求任务本身
          • task.response是响应头
        • responseObject:不是响应头,是响应体,内部已经完成了反序列化处理 (已经把JSON转为了OC对象了)
      • 参数五:网络请求失败之后的回调
        • task:请求任务
        • error:错误信息

使用AFN实现文件下载

  • 创建会话管理者

    • [AFHTTPSessionManager manager]
  • 确定请求路径

  • 创建请求对象

  • 下载

    • [manager downloadTaskWithRequest:progress:destination:completionHandler:
      • 参数一:请求对象
      • 参数二:进度回调
        • NSProgress
        • 计算进度
          • downloadProgress.completedUnitCount/downloadProgress.totalUnitCount;
      • 参数三:destination做URL处理的回调,告诉下载完之后文件写到哪里 ,内部自动做了剪切处理
        • targetPath:文件下载到沙盒中的临时路径
        • response响应头信息
        • 返回值:告诉AFN文件应该剪切到什么地方
        • 怎么把路径转为URL?
          • [NSURL fileURLWithString:]
      • 参数四:完成之后的回调
        • filePath:就是文件最终保存的位置
  • 执行任务

    • [downloadTask resume];
  • 优点:

    • 通过block块集成了下载进度
    • 内部完成了文件剪切处理

使用AFN实现文件上传

  • 不用拼接了
  • 创建会话管理者
  • 发送POST请求上传文件
  • [manager POST:parameters:constructingBodyWithBlock:progress:success:failure:]
    • 参数一:请求路径
    • 参数二:非文件参数,用字典来传
    • 参数三:block块,处理要上传的文件的
      • fromData:遵守AFMultipartFormData协议
        • append有些方法不能用
        • 方式一:appendPartWithFileData:name:fileName:mimeType:
          • 参一:要上传的文件数据
          • 参二:由后台接口规定的file
          • 参三:文件上传到服务器之后,以什么名称保存
          • 参四:文件的二进制数据类型(四种方法获得)image/png
        • 方式二:appendPartWithFileURL:name:filename:mimeType:error:
          • 参一:fileURLWithPath:
          • 参二:file
          • 参三:文件上传到服务器以什么名称保存
          • 参四:文件的二进制数据
        • 方式三:appendPartWithFileURL:name:error:
          • 内部实现
            • 文件名称是拿到文件路径的最后一个节点
            • C语言方法获得mimeType的方法获得mimeType
    • 参数四:进度回调
      • 进度:当前已经完成的/总大小
    • 参数五:成功之后的回调
      • responseObject:响应体,内部把JSON数据转为了OC对象
    • 参数六:失败之后的回调

AFN使用技巧

  • 封装网络请求工具类
    • 工具类依赖AFN
    • 控制器里面发送网络请求的代码用工具类来实现
    • 封装思想

AFN序列化处理

  • 创建会话管理者

    • [AFHTTPSessionManager manager]
  • 创建字典保存参数

  • 发送请求

    • [manager GET:parameters:progress:{}success:{}failure:^{}]
  • 问题一:如果服务器返回的不是JSON数据,而是XML数据怎么处理?

    • 该请求服务器返回的是XML数据,而AFN默认以JSON的方式来处理XML数据
    • 解决:
      • 如果返回的数据是xml,那么应该修改对响应的处理方式为XML
      • manager.responserSerilizer = [AFXMLEParserResponseSerializer serializer]
        • 创建XML解析器
          • (NSXMLParser *)responseObject;
        • 设置代理:parser.delegate = self
        • 开始解析[parser parse]
      • 遵守协议/实现代理方法didStartElement:
  • 问题二:如果服务器返回的既不是JSON也不是XML怎么办?比如对图片发请求(二进制数据)

    • 默认以JSON方式处理
    • 请求失败,怎么解决
      • 如果服务器返回的数据既不是JSON也不是XML,那么就设置为HTTP的解析方式
      • manager.responserSerilizer = [AFHTTPResponseSerializer serializer]
        • imageWithData:
  • 问题三:如果请求的不是图片,而是网页怎么办?

    • 比如对百度发请求
    • 既不是JSON也不是XML使用 AFHTTPResponseSerializer
  • 问题四:以JSON的方式传参数

    • 之前的处理方式:字典
    • manager.requestSerializer = [AFJSONRequestSerializer serializer]

NSURLSession和NSURLConnection对比

  • NSURLSession支持http2.0协议 ios9.0之后
  • NSURLSession在处理下载任务的时候,可以直接把数据下载到沙盒里面
  • NSURLSession支持后台下载|上传
  • 同一个NSURLSession发送多个请求,只需要建立一次连接(复用TCP)
  • NSURLSession提供了全局的session并且可以统一配置,使用更加方便
  • NSURLSession下载的时候是多线程异步处理的,效率更高

总结

  • 文件下载
    • NSURLSessionDataTask - 离线断点下载(断点续传)
    • NSURLSessionDownloadTask -- 缺点:无法离线断点下载
  • 文件上传
  • AFN基本使用
    • GET|POST
    • 下载|上传
    • 工具类|序列化
    • NSURLSession|NSURLConnection对比

AFN监测网络状态改变

  • 网络状态改变
    • 3G/Wifi的切换
    • AFNetworkReachabilityManager
  • 创建一个网络状态监听管理者
    • AFNetworkReachabilityManager sharedManager
  • 监听状态改变
    • [manager setReachabilityStatusChangeBlock:^{}]

      • status:
        • Unkown:网络状态未知
        • NotReachable:没有网络
        • ViaWWAN:蜂窝网络
        • ViaWiFi :wifi
    • 开启网络状态监听者

      • startMonitoring真机演示
      • iTools
        • 以前可以通过iTools拿到应用,对应用做一些操作,现在要拿到应用的数据要花钱,拿不到应用的包
        • 我的iphone应用
        • finder中显示 .ipa
        • 归档实用工具打开,可以拿到图片数据,显示包内容
        • 开发中,需要提测,提测的时候测试部门一般会提供一些测试机,提测的时候,怎么把项目运行到测试机上呢?
          • 提测的时候会要求存档,打包成ipa包,用iTools安装

你可能感兴趣的:(AFN基本使用)