下面介绍一下iOS开发中几种最常用到的AFNetworking方法。
一、实时监测网络状态
可以看到很多app都会有一个功能,当用户的网络发生变化时会出现相应的提醒。AFNetworking提供了一个方法很简单的实现了这一功能。
// 实时监视网络状态的变化
- (void) observeNetworkState {
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"无法识别的网络");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"没有网络");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"移动网络");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WIFI网络");
break;
default:
break;
}
}];
[manager startMonitoring];
}
可以看到上面的代码 网络状态status有四种:
AFNetworkReachabilityStatusUnknown 无法识别的网络
AFNetworkReachabilityStatusNotReachable 无网络
AFNetworkReachabilityStatusReachableViaWWAN 移动网络
AFNetworkReachabilityStatusReachableViaWiFi wifi网络
当网络状态发生变化时,代码会自动走block,通过switch 来区分不同网络状态系统应该做上面操作。
二、GET 和POST请求
// GET请求方法
-(void) getRequest {
// 启动系统风火轮
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
NSString *domainStr = @"http://c.m.163.com/nc/article/headline/T1348647909107/0-20.html";
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//以get的形式提交,只需要将上面的请求地址给GET做参数就可以
[manager GET:domainStr parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
// 下载进度
NSLog(@"进度 - %f", downloadProgress.fractionCompleted);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 隐藏系统风火轮
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
//json解析
NSDictionary *resultDic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:nil];
NSLog(@"---获取到的json格式的字典--%@",resultDic);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@",error);
// 解析失败隐藏系统风火轮(可以打印error.userInfo查看错误信息)
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}];
}
// POST请求方法
-(void)postRequestData{
// 启动系统风火轮
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
//接口
NSString *domainStr = @"xxxxxxxxxxxxx";
//假如需要提交给服务器的参数是key=1,class_id=100
//创建一个可变字典
NSMutableDictionary *parametersDic = [NSMutableDictionary dictionary];
//往字典里面添加需要提交的参数
[parametersDic setObject:@"1" forKey:@"key"];
[parametersDic setObject:@"100" forKey:@"class_id"];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//以post的形式提交,POST的参数就是上面的域名,parameters的参数是一个字典类型,将上面的字典作为它的参数
[manager POST:domainStr parameters:parametersDic progress:^(NSProgress * _Nonnull uploadProgress) {
// 下载进度
NSLog(@"进度 - %f", uploadProgress.fractionCompleted);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 隐藏系统风火轮
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
//json解析
NSDictionary *resultDic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:nil];
NSLog(@"---获取到的json格式的字典--%@",resultDic);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
// 解析失败隐藏系统风火轮(可以打印error.userInfo查看错误信息)
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}];
}
三、下载操作
看到网上写的教程,很多都是错误的,自己琢磨了一下午才在github上找到了解决的办法。
下面演示的是下载一个mp3文件,通过此方法可以实时监测下载进度,可根据需求决定是否添加下载进度条。
- (void)downLoad{
//1.创建管理者对象
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//2.确定请求的URL地址
NSURL *url = [NSURL URLWithString:@"http://yinyueshiting.baidu.com/data2/music/53333773/53333773.mp3?xcode=688e9c2348dace57e4d6351b3c1b445d"];
//3.创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//4.下载任务
NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
//打印下下载进度
// @property int64_t totalUnitCount; 需要下载文件的总大小
// @property int64_t completedUnitCount; 当前已经下载的大小
NSLog(@"%lf",1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
//下载地址
NSLog(@"默认下载地址:%@",targetPath);
// 获取documents路径
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
// 自己为文件取一个名字ddd.mp3
// NSString *path2 = [path stringByAppendingString:@"/ddd.mp3"];
// 根据下载的文件自带的名字response.suggestedFilename
// 拼接文件下载存放路径
NSString *path2 = [path stringByAppendingPathComponent:response.suggestedFilename];
NSURL *url = [NSURL fileURLWithPath:path2];
return url;
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
//下载完成调用的方法 NSLog(@"下载完成:");
NSLog(@"=====%@--%@",response,filePath);
}];
//开始启动任务
[task resume];
}
下载完成在沙盒中可以看到歌曲已经下载下来。
如果这篇文章对您有一丢丢帮助 请给我点个心哦。
未完待续。。。。。