您的位置:首页 > 其它

AFNetworking 3.0 版本使用

2016-07-09 16:27 288 查看


AFNetworking 3.0 版本使用

在Xcode7.0之后,苹果废弃了NSURLConnection方法,数据请求使用NSURLSession,作为网络请求类第三方库使用量最大的AFN也及时的更新的新的版本——AFN 3.0版本。新的版本的里废弃了基于NSURLConnection封装的AFHTTPRequestOperationManager,转而使用基于NSURLSession封装的AFHTTPSessionManager了。

下面将详细介绍AFN3.0的使用


1.cocoapods导入AFN 3.0

1.1 进入到工程目录下

$ cd 工程目录名

1.2 搜索最新的AFN库版本

$ pod search AFNetworking

1.3 创建podfile文件

$ vim podfile

1.4 按下键盘“i”键,输入如下的pod语句,然后按下“esc”键,退出编辑,再输入“:wq”,保存退出vim,项目根目录下就会新建我们需要的podfile文件

$ platform:iOS,’7.0’

$ pod ‘AFNetworking’,’~>3.1.0’

1.5 导入AFN库,使用如下语句导入和直接$ pod install的区别是略过cocoaPods的库更新过程,导入速度较快

$ pod install –verbose –no-repo-update

导入成功,使用后缀名为.xcworkspace的文件打开工程


2.配置plist文件

在Xcode 7.0之后,苹果使用了https的网路协议,所以在网络请求前,我们还需要配置一下工程的Info.plist文件

右键Info.plist文件 -> open as -> source code ,找到下图位置,粘贴如下代码

[objc] view
plain copy







<key>NSAppTransportSecurity</key>

<dict>

<key>NSAllowsArbitraryLoads</key>

<true/>

</dict>








3.使用AFN进行数据请求


3.1 请求管理类 (HttpsManager)

该类里都是+号方法,不是单例类

在.h里定义超时时间宏,以及成功和失败的block块

[objc] view
plain copy







#define kTimeOutInterval 30 // 请求超时的时间

typedef void (^SuccessBlock)(NSDictionary *dict, BOOL success); // 访问成功block

typedef void (^AFNErrorBlock)(NSError *error); // 访问失败block



封装AFN请求管理者

[objc] view
plain copy







#pragma mark - 创建请求者

+(AFHTTPSessionManager *)manager

{

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

// 超时时间

manager.requestSerializer.timeoutInterval = kTimeOutInterval;

// 声明上传的是json格式的参数,需要你和后台约定好,不然会出现后台无法获取到你上传的参数问题

manager.requestSerializer = [AFHTTPRequestSerializer serializer]; // 上传普通格式

// manager.requestSerializer = [AFJSONRequestSerializer serializer]; // 上传JSON格式

// 声明获取到的数据格式

manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // AFN不会解析,数据是data,需要自己解析

// manager.responseSerializer = [AFJSONResponseSerializer serializer]; // AFN会JSON解析返回的数据

// 个人建议还是自己解析的比较好,有时接口返回的数据不合格会报3840错误,大致是AFN无法解析返回来的数据

return manager;

}




3.2 get

[objc] view
plain copy







+ (void)getUserCarShopAndSalesDataForSalesWithUserId:(NSString *)userId date:(NSString *)date selectAreaType:(NSString *)areaType Success:(SuccessBlock)success fail:(AFNErrorBlock)fail

{

// get请求也可以直接将参数放在字典里,AFN会自己讲参数拼接在url的后面,不需要自己凭借

NSDictionary *param = @{@”user_id”:userId, @”sale_date”:date, @”accessToken”:@”e9c0e60318ebd07ec2fe”, @”area_type”:areaType};

// 创建请求类

AFHTTPSessionManager *manager = [self manager];

[manager GET:@”http://pm.yunhan-china.com/index.php/Api_sale/sales_get” parameters:param progress:^(NSProgress * _Nonnull downloadProgress) {

// 这里可以获取到目前数据请求的进度

} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {

// 请求成功

if(responseObject){

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];

success(dict,YES);

} else {

success(@{@”msg”:@”暂无数据”}, NO);

}

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

// 请求失败

fail(error);

}];

}




3.3 post

[objc] view
plain copy







+ (void)loginWithUserAccount:(NSString *)account password:(NSString *)password success:(SuccessBlock)success fail:(AFNErrorBlock)fail

{

// 将请求参数放在请求的字典里

NSDictionary *param = @{@”phoneNumber”:account, @”password”:@”f379eaf3c831b04de153469d1bec345e”};

// 创建请求类

AFHTTPSessionManager *manager = [self manager];

[manager POST:@”http://pm.yunhan-china.com/index.php/api_common/login” parameters:param progress:^(NSProgress * _Nonnull uploadProgress) {

// 这里可以获取到目前数据请求的进度

} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {

// 请求成功

if(responseObject){

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];

success(dict,YES);

} else {

success(@{@”msg”:@”暂无数据”}, NO);

}

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

// 请求失败

fail(error);

}];

}




3.4 下载

[objc] view
plain copy







- (void)downLoadWithUrlString:(NSString *)urlString

{

// 1.创建管理者对象

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

// 2.设置请求的URL地址

NSURL *url = [NSURL URLWithString:urlString];

// 3.创建请求对象

NSURLRequest *request = [NSURLRequest requestWithURL:url];

// 4.下载任务

NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {

// 下载进度

NSLog(@”当前下载进度为:%lf”, 1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);

} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {

// 下载地址

NSLog(@”默认下载地址%@”,targetPath);

// 设置下载路径,通过沙盒获取缓存地址,最后返回NSURL对象

NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];

return [NSURL fileURLWithPath:filePath]; // 返回的是文件存放在本地沙盒的地址

} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {

// 下载完成调用的方法

NSLog(@”%@—%@”, response, filePath);

}];

// 5.启动下载任务

[task resume];

}




3.5 上传

[objc] view
plain copy







- (void)uploadWithUser:(NSString *)userId UrlString:(NSString *)urlString upImg:(UIImage *)upImg

{

// 创建管理者对象

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

// 参数

NSDictionary *param = @{@”user_id”:userId};

[manager POST:urlString parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {

/******** 1.上传已经获取到的img *******/

// 把图片转换成data

NSData *data = UIImagePNGRepresentation(upImg);

// 拼接数据到请求题中

[formData appendPartWithFileData:data name:@”file” fileName:@”123.png” mimeType:@”image/png”];

/******** 2.通过路径上传沙盒或系统相册里的图片 *****/

// [formData appendPartWithFileURL:[NSURL fileURLWithPath:@”文件地址”] name:@”file” fileName:@”1234.png” mimeType:@”application/octet-stream” error:nil];

} progress:^(NSProgress * _Nonnull uploadProgress) {

// 打印上传进度

NSLog(@”%lf”,1.0 *uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);

} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {

//请求成功

NSLog(@”请求成功:%@”,responseObject);

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

//请求失败

NSLog(@”请求失败:%@”,error);

}];

}




3.6 网络监听

[objc] view
plain copy







- (void)AFNetworkStatus{

//1.创建网络监测者

AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];

/*枚举里面四个状态 分别对应 未知 无网络 数据 WiFi

typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {

AFNetworkReachabilityStatusUnknown = -1, 未知

AFNetworkReachabilityStatusNotReachable = 0, 无网络

AFNetworkReachabilityStatusReachableViaWWAN = 1, 蜂窝数据网络

AFNetworkReachabilityStatusReachableViaWiFi = 2, WiFi

};

*/

[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

//这里是监测到网络改变的block 可以写成switch方便

//在里面可以随便写事件

switch (status) {

case AFNetworkReachabilityStatusUnknown:

NSLog(@”未知网络状态”);

break;

case AFNetworkReachabilityStatusNotReachable:

NSLog(@”无网络”);

break;

case AFNetworkReachabilityStatusReachableViaWWAN:

NSLog(@”蜂窝数据网”);

break;

case AFNetworkReachabilityStatusReachableViaWiFi:

NSLog(@”WiFi网络”);

break;

default:

break;

}

}] ;

}



本文转载自http://blog.csdn.net/ios_wq/article/details/51285444
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: