最近一直在研究iOS网络开发,对NSURLSession套件进行了深入研究,作为iOS开发者,熟悉苹果的原生技术,可以在不需要第三方框架的情况下进行网络开发,也更有利于从底层了解iOS网络请求的原理,不过为了便捷开发,我们可能使用点第三方的框架的机会会更多,这就不得不提AFNetworking了,我将通过本文总结AFNetworking2.0的使用。

AFNetworking的版本和要求

我们先来了解AFNetworking的各个版本:

AFNetworking的结构

我们再通过一张表来清晰地介绍AFNetworking 2.0包含的类,以及它的结构。

AFNetworking 2.0类结构

NSURLConnection

AFURLConnectionOperation

NSOperation子类,实现NSURLConnection代理方法

AFHTTPRequestOperation

AFURLConnectionOperation子类,用于http和https请求,封装了状态码和content type

AFHTTPRequestOperationManager

封装了常见的http网络通信,包括request请求的建立、response响应的数据格式序列化、网络状态监控、安全以及请求的管理等工作。

NSURLSession

AFURLSessionManager

对NSURLSession网络请求技术的封装。它基于NSURLSessionConfiguration对象来创建和管理NSURLSession对象,并且遵守了NSURLSessionTaskDelegate、NSURLSessionDataDelegate、NSURLSessionDownloadDelegate、NSURLSessionDelegate。

AFHTTPSessionManager

AFURLSessionManager的子类,主要提供了了http请求的有关方法

Serialization

序列化

AFHTTPRequestSerializer

AFJSONRequestSerializer

AFPropertyListRequestSerializer

AFHTTPResponseSerializer

AFJSONResponseSerializer

AFXMLParserResponseSerializer

AFXMLDocumentResponseSerializer

AFPropertyListResponseSerializer

AFImageResponseSerializer

AFCompoundResponseSerializer

监控网络

AFNetworkReachabilityManager

AFNetworkReachabilityManager监测域名以及IP地址的畅通性,对于WWAN以及WiFi的网络接口都管用。

附加功能

AFSecurityPolicy

AFNetworkReachabilityManager

AFNetworking各大类介绍

一、AFHTTPRequestOperationManager

AFHTTPRequestOperationManager封装了常见的http网络通信,包括request请求的建立、response响应的数据格式序列化、网络状态监控、安全以及请求的管理等工作。

1.get请求

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"http://example.com/resources.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

2.post请求

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"foo": @"bar"};
[manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

3.更复杂的post请求

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"foo": @"bar"};
NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"];
[manager POST:@"http://example.com/resources.json" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    [formData appendPartWithFileURL:filePath name:@"image" error:nil];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

二、AFURLSessionManager

AFURLSessionManager主要是对NSURLSession网络请求技术的封装。它基于NSURLSessionConfiguration对象来创建和管理NSURLSession对象,并且遵守了NSURLSessionTaskDelegate、NSURLSessionDataDelegate、NSURLSessionDownloadDelegate、NSURLSessionDelegate。

1.创建下载任务

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSURL *URL = [NSURL URLWithString:@"http://example.com/download.zip"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];

NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
    NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
    return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
    NSLog(@"File downloaded to: %@", filePath);
}];
[downloadTask resume];

2.创建上传任务

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];

NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"];
NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromFile:filePath progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
    if (error) {
        NSLog(@"Error: %@", error);
    } else {
        NSLog(@"Success: %@ %@", response, responseObject);
    }
}];
[uploadTask resume];

3.创建包含进度显示的复杂的上传任务

NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"file://path/to/image.jpg"] name:@"file" fileName:@"filename.jpg" mimeType:@"image/jpeg" error:nil];
    } error:nil];

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSProgress *progress = nil;

NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
    if (error) {
        NSLog(@"Error: %@", error);
    } else {
        NSLog(@"%@ %@", response, responseObject);
    }
}];

[uploadTask resume];

4.创建数据任务

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];

NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
    if (error) {
        NSLog(@"Error: %@", error);
    } else {
        NSLog(@"%@ %@", response, responseObject);
    }
}];
[dataTask resume];

三、AFNetworkReachabilityManager

AFNetworkReachabilityManager监测域名以及IP地址的畅通性,对于WWAN以及WiFi的网络接口都管用。

1.单例形式检测网络畅通性

[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
}];

2.用基本的URL管理HTTP

NSURL *baseURL = [NSURL URLWithString:@"http://example.com/"];
AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL];

NSOperationQueue *operationQueue = manager.operationQueue;
[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
  switch (status) {
    case AFNetworkReachabilityStatusReachableViaWWAN:
    case AFNetworkReachabilityStatusReachableViaWiFi:
      [operationQueue setSuspended:NO];
      break;
    case AFNetworkReachabilityStatusNotReachable:
    default:
      [operationQueue setSuspended:YES];
      break;
  }
}];

四、AFHTTPRequestOperation

  AFHTTPRequestOperation 继承自 AFURLConnectionOperation,使用HTTP以及HTTPS协议来处理网络请求。它封装成了一个可以令人接受的代码形式。当然AFHTTPRequestOperationManager 目前是最好的用来处理网络请求的方式,但AFHTTPRequestOperation 也有它自己的用武之地。

1.AFHTTPRequestOperation发送get请求

NSURL *URL = [NSURL URLWithString:@"http://example.com/resources/123.json"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
op.responseSerializer = [AFJSONResponseSerializer serializer];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];
[[NSOperationQueue mainQueue] addOperation:op];

2.多操作一起进行

NSMutableArray *mutableOperations = [NSMutableArray array];
for (NSURL *fileURL in filesToUpload) {
    NSURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        [formData appendPartWithFileURL:fileURL name:@"images[]" error:nil];
    }];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

    [mutableOperations addObject:operation];
}

NSArray *operations = [AFURLConnectionOperation batchOfRequestOperations:@[...] progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) {
    NSLog(@"%lu of %lu complete", numberOfFinishedOperations, totalNumberOfOperations);
} completionBlock:^(NSArray *operations) {
    NSLog(@"All operations in batch complete");
}];
[[NSOperationQueue mainQueue] addOperations:operations waitUntilFinished:NO];

最新文章

  1. 性能优化方法(Z)
  2. nginx日常运维
  3. UITextFiled,UITextView长度限制
  4. sql server 使用for xml path 将1列多行转换为字符串连接起来,俗称 sql 合并字符
  5. linux(centos6)搭建ftp服务器
  6. Android的Activity生命周期
  7. Hbase快速开始——shell操作
  8. 【Django】如何自定义manage.py命令? 达到启动后台进程的目的?
  9. 【Hibernate】Hibernate系列8之管理session
  10. jstack命令详解
  11. 前端面试题第一波,要offer的看过来~
  12. javascript eval和JSON之间的联系(转)
  13. javascript事件:获取事件对象getEvent函数
  14. 201521123103 《java学习笔记》 第十二周学习总结
  15. linux 下启动java jar包 shell
  16. ThreadPoolExecutor简介
  17. 虚拟机 与 host主机,无法ping通的问题
  18. ajax的优缺点
  19. Pycharm快捷键大全(windows + Mac)
  20. BZOJ1084或洛谷2331 [SCOI2005]最大子矩阵

热门文章

  1. iOS开发 差间距滚动
  2. javascript AOP实现
  3. iOS高性能图片架构与设计
  4. c++相关的类型推导
  5. 1.2 认识ASP.NET MVC项目结构
  6. 手机页面head中的meta元素
  7. [Java] 数据库连接管理类
  8. centos7 学习
  9. KVC与KVO的进阶使用
  10. 语句--分支语句if case