前言
AFNetworking是一个为 iOS 和 Mac OSX 制作的令人愉快的网络库,它建立在URL 装载系统框架的顶层,内置在Cocoa里,扩展了强有力的高级网络抽象。以最新的3.1.0版本读阅.本篇只对其基本使用方法作介绍,不涉及ji'shu
介绍
AFNetworking
大致分为五个模块:
- 对外接口和请求处理文件
- 发送和响应管理文件
- 安全策略文件
- 网路状态监听文件
- UIKit相关扩展文件
注:框架内部也是按照这几种功能,做的文件夹分类
基本使用
创建
//创建请求
AFHTTPSessionManger *manger = [AFHTTPSession manger];
/**
The dispatch queue for `completionBlock`. If `NULL` (default), the main queue is used.
*/
manger.completionQueue;
//回调执行所在线程 不传默认在主线程执行
/**
The dispatch group for `completionBlock`. If `NULL` (default), a private dispatch group is used.
*/
manger.completionGroup;
//回调执行所在组 不传默认在AFN内部的私有组执行
/**
Whether to attempt to retry creation of upload tasks for background sessions when initial call returns `nil`. `NO` by default.
*/
manger.attemptsToRecreateUploadTasksForBackgroundSessions
//这个属性非常重要,注释里面写到,在iOS7中存在一个bug,在创建后台上传任务时,有时候会返回nil,所以为了解决这个问题,AFNetworking遵照了苹果的建议,在创建失败的时候,会重新尝试创建,次数默认为3次,所以你的应用如果有场景会有在后台上传的情况的话,记得将该值设为YES,避免出现上传失败的问题.
一、请求服务器数据
GET请求
NSString *url = @"http://example.com/";
//发送请求
[manager GET: url parameters:@"" progress:^(NSProgress * _Nonnull downloadProgress) {
// 进度
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 成功回调
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
// 失败回调
}];
POST请求
//发送请求
[manager POST:@"" parameters: url progress:^(NSProgress * _Nonnull downloadProgress) {
// 进度
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 成功回调
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
// 失败回调
}];
二、下载数据
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];
三、上传数据
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]];
NSURLSessionUploadTask *uploadTask;
uploadTask = [manager
uploadTaskWithStreamedRequest:request
progress:^(NSProgress * _Nonnull uploadProgress) {
// This is not called back on the main queue.
// You are responsible for dispatching to the main queue for UI updates
dispatch_async(dispatch_get_main_queue(), ^{
//Update the progress view
[progressView setProgress:uploadProgress.fractionCompleted];
});
}
completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
if (error) {
NSLog(@"Error: %@", error);
} else {
NSLog(@"%@ %@", response, responseObject);
}
}];
[uploadTask resume];
四、网络监测
//创建一个单例manager
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
//监测网络状态改变
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"没有网络");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"连接到路由器网络不能到达");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"2G/3G/4G");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"wifi");
break;
}
}];
//开启检测
[manager startMonitoring];
注:以上所写全是基本接口, 使用起来太复杂,可以根据自己项目需要进行封装