转载:点击打开链接http://www.jianshu.com/p/a366c68d3ac6
原著:JanzTam
声明
文章非本人所写,只是转来编辑方便阅读,让大家学习借鉴。 来源-iOS网络编程(7)第三方开源库 AFNetworking
前言
AFNetworking是一个为 iOS 和 Mac OSX 制作的令人愉快的网络库,它建立在URL 装载系统框架的顶层,内置在Cocoa里,扩展了强有力的高级网络抽象。它的模块架构被良好的设计,拥有丰富的功能,因此,使用起来,必定赏心悦目。
AFNetworking-github原文链接,作者在此基础上了点配置修改
介绍
支持HTTP请求和基于REST的网络服务(包括GET、POST、 PUT、DELETE等)支持ARC要求iOS 5.0及以上版本UIKit扩展
配置
下载AFNetworking,将2个文件夹:AFNetworking和UIKit+AFNetworking拖入工程导入以下库文件:CFNetwork、Security、SystemConfiguration、MobileCoreServices如果你以前用的是1.0版本,那么AFNetworking 2.0 Migration Guide能帮助你如果你是用CocoaPods配置的,那么 platform:ios,'7.0' pod"AFNetworking","~>2.0"
使用
1. HTTP请求操作
AFHTTPRequestOperationManager封装的共同模式与web应用程序通过HTTP通信,包括创建请求,响应序列化,网络可达性监控、运营管理和安全,以及请求。
GET请求
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[
manager GET:@"[http://example.com/resources.json](
http://example.com/resources.json)"
parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation
*operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
POST请求
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *
parameters = @{@
"foo": @
"bar"};
[manager POST:@
"http://example.com/resources.json" parameters:
parameters
NSLog(@
"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@
"Error: %@", error);
}];
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);
}];
2.AFURLSessionManager(NSURLSession详细见网络编程(6))
创建和管理制定的NSURLSession对象NSURLSessionConfiguration对象必须实现<NSURLSessionTaskDelegate>, <NSURLSessionDataDelegate>, <NSURLSessionDownloadDelegate>, <NSURLSessionDelegate>协议
创建一个下载任务
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];
创建一个上传任务
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];
创建一个带多表,进度的上传任务
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];
创建一个数据流Data任务
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];
3.网络监测(一般会用另一个网络监测类,Reachability,还有JSON解析方法)
AFNetworkReachabilityManager监控网络领域的可达性,WWAN地址和WiFi接口.
当前网络状态
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(
AFNetworkReachabilityStatus status) {
NSLog(@
"Reachability: %@", AFStringFromNetworkReachabilityStatus(
status))
}]
HTTP Manager 可达性
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;
}
}];
4. AFHTTPRequestOperation
AFHTTPRequestOperation是使用HTTP或HTTPS协议的AFURLConnectionOperation的子类。 它封装的获取后的HTTP状态和类型将决定请求的成功与否。虽然AFHTTPRequestOperationManager通常是最好的去请求的方式,但是AFHTTPRequestOpersion也能够单独使用。
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];
批量多请求
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、iOS网络编程之ASIHTTPRequest框架同步请求 2、iOS网络编程之MBProgressHUD等待指示器 3、iOS网络编程之iOS中Socket编程介绍 4、iOS网络编程之NSStream实现TCP Socket iPhone客户端 5、iOS网络编程之iOS中解析Bonjour服务 6、iOS网络编程之iCloud文档存储编程实例 7、iOS开发网络编程之断点续传NSURLConnection 8、iOS网络编程(六)NSURLSession详解