AFNetworking3的基本使用

AFNetworking一直是iOS和Mac OS X上最热门的网络库。之前一直用的是2.x版本,前不久更新了3才发现原来的代码一堆错。原来为了配合iOS7网络接口的调整,AFN3.x取消了AFHTTPRequestOperationManager及相关的类,取而代之的是AFURLSessionManager。如果为了兼容iOS 6、Mac OS X 10.8或更低版本,你仍然可以选择AFHTTPRequestOperationManager。

安装

最方便的就是用CocoaPods了,在Podfile中加入:

1
pod 'AFNetworking', '~> 3.0'

创建manger

苹果的文档中推荐开发者通过继承AFHTTPSessionManager来提供一些通用的配置,在整个应用中可以共享一个单例。这样就避免了在每次发送http请求时进行三次握手,一定程度上提高了效率。

如果访问的服务器是同一个,可以用baseURL来初始化,这样发送请求时只需要相对url。

1
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:BASE_URL]];

也可以用配置对象来初始化

1
2
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:configuration];

配置Serializer

1
2
3
4
5
6
7
8
9
// 设置请求数据格式
manager.requestSerializer = [AFJSONRequestSerializer serializer];
// 设置请求超时时间
manager.requestSerializer.timeoutInterval = 15;
// 设置相应数据格式
manager.responseSerializer = [AFJSONResponseSerializer serializer];
// 如果得不到相应数据,可能是可接受的数据类型不匹配
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html", nil];

常用方法

  • GET
1
2
3
4
5
6
7
8
9
10
11
[manager GET:@"url/string"
parameters:@{@"key":@"value"}
progress:^(NSProgress * _Nonnull downloadProgress) {
NSLog(@"%f", uploadProgress.completedUnitCount / uploadProgress.totalUnitCount * 1.0);
}
success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@", responseObject);
}
failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@", error);
}];
  • POST
1
2
3
4
5
6
7
8
9
10
11
[manager POST:@"url/string"
parameters:@{@"key":@"value"}
progress:^(NSProgress * _Nonnull downloadProgress) {
NSLog(@"%f", uploadProgress.completedUnitCount / uploadProgress.totalUnitCount * 1.0);
}
success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@", responseObject);
}
failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@", error);
}];
  • 下载
1
2
3
4
5
6
7
8
9
10
11
NSURL *URL = [NSURL URLWithString:@"http://example.com/download.zip"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
NSLog(@"%f", uploadProgress.completedUnitCount / uploadProgress.totalUnitCount * 1.0);
} destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
return [NSURL URLWithString:@"path/to/save/to"];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"File downloaded to: %@", filePath);
}];
[downloadTask resume];
  • 上传
1
2
3
4
5
6
7
8
9
[manager POST:@"url/string" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
[formData appendPartWithFileURL:[NSURL fileURLWithPath:@"file://path/to/image.jpg"] name:@"file" fileName:@"filename.jpg" mimeType:@"image/jpeg" error:nil];
} progress:^(NSProgress * _Nonnull uploadProgress) {
NSLog(@"%f", uploadProgress.completedUnitCount / uploadProgress.totalUnitCount * 1.0);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@", error);
}];

也可以使用NSURLSessionUploadTask上传,它还支持后台上传:

1
2
3
4
5
6
7
8
9
10
11
12
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];

NetworkActivityIndicator

AFNetworking提供了在网络请求繁忙时,在状态栏显示小菊花的功能。这个功能默认是关闭的,需要手动打开:

1
[AFNetworkActivityIndicatorManager sharedManager].enabled = YES;

需要导入包:

1
#import "AFNetworkActivityIndicatorManager.h"

监测网络状态

AFNetworkReachabilityManager提供了一个单例对象来监测网络,共有四种状态,分别是未知、没有网络连接、WWAN连接、WiFi连接:

1
2
3
4
5
6
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
AFNetworkReachabilityStatusUnknown = -1,
AFNetworkReachabilityStatusNotReachable = 0,
AFNetworkReachabilityStatusReachableViaWWAN = 1,
AFNetworkReachabilityStatusReachableViaWiFi = 2,
};
1
2
3
4
5
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
}];
[[AFNetworkReachabilityManager sharedManager] startMonitoring];

总结

跟上一个版本相比,AFN3最大的变化就是AFHTTPRequestOperationManager没有了,换成了AFURLSessionManager

这些只是AFN3中最基本的用法,还有更多强大的功能,共同学习!

最后附上AFN的GitHub地址