zoukankan      html  css  js  c++  java
  • iOS 网络编程:AFNetworking

    1 简介

    1.1 概念

           AFNetworking网络框架并不是IOS自带的框架,而是第三方的开源框架。它是对NSURLConnection和NSURLSession API的封装,但是目前AFNetworking 3.0已经删除了基于 NSURLConnection API的所有支持,所以本文只记录基于NSURLSession API的相关接口。AFNetworking 框架是基于Object-C语言,若需要使用Swift语言版可以了解Alamofire框架。

         个人感觉学习AFNetworking 框架非常麻烦,它没有提供guide,所以只能按着GitHub和头文件进行学习。

    1.2 第一个程序

    1.2.1 环境配置

          环境配置非常简单,有多种方式,在GitHub提供了几种方法,这里使用最简单的方式:导入源码。 新建IOS项目后,导入在GitHub网站下载的AFNetworking 源码,如图 2所示。  

    图 2

    1.2.2 源码

          其使用如下所示,只需引入AFNetworking.h文件即可使用其API。

     1 #include "AFNetworking.h"
     2 -(void)DownloadTask
     3 {
     4     NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
     5     AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
     6     
     7     NSURL *URL = [NSURL URLWithString:@"http://example.com/download.zip"];
     8     NSURLRequest *request = [NSURLRequest requestWithURL:URL];
     9     
    10     NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
    11         NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
    12         return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
    13     } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
    14         NSLog(@"File downloaded to: %@", filePath);
    15     }];
    16     [downloadTask resume];
    17 }

    2 AFURLSessionManager

          AFURLSessionManager是对NSURLSession的封装,其实现了NSURLSession的四个协议。所以提供的功能与NSURLSession一样,拥有三种任务类型:dataTask、uploadTask和downloadTask。

    2.1 使用步骤

           其实AFURLSessionManager对NSURLSession的封装,只封装了两个部分:

    • 创建NSURLSession对象的过程;
    • 创建NSURLSessionTask对象过程。

          从而AFURLSessionManager与NSURLSession类似,如下是使用步骤:

    1. 创建NSURLSessionConfiguration对象;(与NSURLSession一样)
    2. 通过传递NSURLSessionConfiguration对象,创建AFURLSessionManager对象;
    3. 通过传递请求对象(如NSURLRequest对象)给AFURLSessionManager对象的某个方法,从而创建任务(NSURLSessionTask);
    4. 调用NSURLSessionTask对象的resume来启动任务。

       如下是创建一个Data Task,只有AFURLSessionManager 是AFNetworking提供的类,其它都是IOS自带的类。

     1 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];  //步骤1
     2 AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];  //步骤2
     3 
     4 //步骤3
     5 NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"];
     6 NSURLRequest *request = [NSURLRequest requestWithURL:URL];
     7 NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
     8     if (error) {
     9         NSLog(@"Error: %@", error);
    10     } else {
    11         NSLog(@"%@ %@", response, responseObject);
    12     }
    13 }];
    14 [dataTask resume];   //步骤4

    2.2 提供的功能

          AFURLSessionManager提供的三种任务类型:dataTask、uploadTask和downloadTask,所以提供的功能都是围着这三种任务类型。

    2.2.1 创建任务

          可以调用AFURLSessionManager对象的相应方法来创建三种任务:

    表 31 AFURLSessionManager对象创建任务方法

    任务类型

    创建方法

    语义

    NSURLSessionDataTask

    dataTaskWithRequest:request:completionHandler:

    用NSURLRequest对象创建任务。

    dataTaskWithRequest:request:uploadProgress:downloadProgress:

    用NSURLRequest对象创建任务。

    NSURLSessionUploadTask

    uploadTaskWithRequest:request: fromFile:

    用NSURLRequest对象创建上传任务,上传的路径是NSURL所指的路径。

    uploadTaskWithRequest:request: fromData:

    用NSURLRequest对象创建上传任务,上传的是HTTP体。

    uploadTaskWithStreamedRequest:request:

    用streaming NSURLRequest对象创建上传任务,

    NSURLSessionDownloadTask

    downloadTaskWithRequest:request:

    用NSURLRequest对象创建下载任务。

    downloadTaskWithResumeData:resumeData

    用NSData对象创建下载任务。

    2.2.2 获取任务对象

          由于AFURLSessionManager对象可以创建三种类型的任务,并且当创建完成后其内部存在所有已经创建任务对象的引用,在AFURLSessionManager对象内部有四个任务集合:

    • tasks:表示当前在managed session运行的data, upload, 和download任务;
    • dataTasks:表示当前在managed session运行的data任务;
    • uploadTasks:表示当前在managed session运行的 upload任务;
    • downloadTasks。表示当前在managed session运行的download任务。

    2.2.3 监听任务状态

          AFURLSessionManager对象可以对所创建的任务进行监听,当这些任务发生变化时,可以执行指定的block,具体内容可以参考该类的.h文件。

    如下是AFURLSessionManager对象的一个方法声明,其语义是指当data task任务收到data对象时,就执行block块:

    1 - (void)setTaskDidCompleteBlock:(nullable void (^)(NSURLSession *session, NSURLSessionTask *task, NSError * _Nullable error))block;

    3 AFHTTPSessionManager

             AFHTTPSessionManager类是AFURLSessionManager类的子类,它只是提供的一些方便进行HTTP请求的方法。当然AFURLSessionManager类本身也可以进行HTTP请求,但需要配置NSURLRequest对象。

    3.1 使用步骤

    AFHTTPSessionManager使用起来比AFURLSessionManager更加简单,其使用步骤是:

    1. 创建AFHTTPSessionManager对象;
    2. 调用HTTP方法。

    如下是使用HTTP的GET方法:

    1 -(void)HTTPSessionManager
    2 {
    3     AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init];
    4     [manager GET:@"http://example.com/foo.json" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    5         NSLog(@"success");
    6     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    7         NSLog(@"error");
    8     }];
    9 }

    3.2 提供的方法

          AFHTTPSessionManager类提供的6种常用的HTTP方法:

    表 32 AFHTTPSessionManager类提供的HTTP方法

    HTTP方法

    类方法

    语义

    GET

    GET:URLStringparameters: success:failure:

    从服务器获取一份文档

    GET:URLString:parameters: progress: success: failure:

    HEAD

    HEAD:URLString:parameters:success:failure:

    只从服务器获取文档的首部

    POST

    POST:URLString:parameters:progress:success:failure:

    向服务器发送需要处理的数据

    PUT

    PUT:URLString:parameters:success:failure:

    将请求的主体部分存储在服务器上。

    PATCH

    PATCH:URLString:parameters:success:failure:

    对可能经过代理服务器传送到服务器上去的报文进行追踪。

    DELETE

    DELETE:URLString:parameters:success:failure:

    从服务器上删除一份文档。

    4 参考文献

        [1] URL Session programming guide。

        [2] AFNetworking GitHub地址

  • 相关阅读:
    Diffusion Particle Resolver
    GPU Jacobi Iterator
    Remark for ColorSpectrum Rendering
    关于Windows的命令行多语言输出
    DPR Sphere in Cloud
    看到一篇有意思的东西,记录一下
    GFS的系统架构
    jsp实现树状结构
    工作笔记
    批量删除
  • 原文地址:https://www.cnblogs.com/huliangwen/p/5496457.html
Copyright © 2011-2022 走看看