下面介紹一下iOS開發(fā)中幾種最常用到的AFNetworking方法。
一、實時監(jiān)測網(wǎng)絡(luò)狀態(tài)
可以看到很多app都會有一個功能,當用戶的網(wǎng)絡(luò)發(fā)生變化時會出現(xiàn)相應(yīng)的提醒。AFNetworking提供了一個方法很簡單的實現(xiàn)了這一功能。
// 實時監(jiān)視網(wǎng)絡(luò)狀態(tài)的變化
- (void) observeNetworkState {
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"無法識別的網(wǎng)絡(luò)");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"沒有網(wǎng)絡(luò)");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"移動網(wǎng)絡(luò)");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WIFI網(wǎng)絡(luò)");
break;
default:
break;
}
}];
[manager startMonitoring];
}
可以看到上面的代碼 網(wǎng)絡(luò)狀態(tài)status有四種:
AFNetworkReachabilityStatusUnknown? 無法識別的網(wǎng)絡(luò)
AFNetworkReachabilityStatusNotReachable? 無網(wǎng)絡(luò)
AFNetworkReachabilityStatusReachableViaWWAN 移動網(wǎng)絡(luò)
AFNetworkReachabilityStatusReachableViaWiFi? wifi網(wǎng)絡(luò)
當網(wǎng)絡(luò)狀態(tài)發(fā)生變化時,代碼會自動走block,通過switch 來區(qū)分不同網(wǎng)絡(luò)狀態(tài)系統(tǒng)應(yīng)該做上面操作。
二、GET 和POST請求
// GET請求方法
-(void) getRequest {
// 啟動系統(tǒng)風火輪
[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做參數(shù)就可以
[manager GET:domainStr parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
// 下載進度
NSLog(@"進度 - %f", downloadProgress.fractionCompleted);
} success:^(NSURLSessionDataTask * _Nonnull task, id? _Nullable responseObject) {
// 隱藏系統(tǒng)風火輪
[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);
// 解析失敗隱藏系統(tǒng)風火輪(可以打印error.userInfo查看錯誤信息)
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}];
}
// POST請求方法
-(void)postRequestData{
// 啟動系統(tǒng)風火輪
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
//接口
NSString *domainStr = @"xxxxxxxxxxxxx";
//假如需要提交給服務(wù)器的參數(shù)是key=1,class_id=100
//創(chuàng)建一個可變字典
NSMutableDictionary *parametersDic = [NSMutableDictionary dictionary];
//往字典里面添加需要提交的參數(shù)
[parametersDic setObject:@"1" forKey:@"key"];
[parametersDic setObject:@"100" forKey:@"class_id"];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//以post的形式提交,POST的參數(shù)就是上面的域名,parameters的參數(shù)是一個字典類型,將上面的字典作為它的參數(shù)
[manager POST:domainStr parameters:parametersDic progress:^(NSProgress * _Nonnull uploadProgress) {
// 下載進度
NSLog(@"進度 - %f", uploadProgress.fractionCompleted);
} success:^(NSURLSessionDataTask * _Nonnull task, id? _Nullable responseObject) {
// 隱藏系統(tǒng)風火輪
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
//json解析
NSDictionary *resultDic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:nil];
NSLog(@"---獲取到的json格式的字典--%@",resultDic);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
// 解析失敗隱藏系統(tǒng)風火輪(可以打印error.userInfo查看錯誤信息)
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}];
}
三、下載操作
看到網(wǎng)上寫的教程,很多都是錯誤的,自己琢磨了一下午才在github上找到了解決的辦法。
下面演示的是下載一個mp3文件,通過此方法可以實時監(jiān)測下載進度,可根據(jù)需求決定是否添加下載進度條。
- (void)downLoad{
//1.創(chuàng)建管理者對象
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//2.確定請求的URL地址
NSURL *url = [NSURL URLWithString:@"http://yinyueshiting.baidu.com/data2/music/53333773/53333773.mp3?xcode=688e9c2348dace57e4d6351b3c1b445d"];
//3.創(chuàng)建請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//4.下載任務(wù)
NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
//打印下下載進度
// @property int64_t totalUnitCount;? ? 需要下載文件的總大小
// @property int64_t completedUnitCount; 當前已經(jīng)下載的大小
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"];
// 根據(jù)下載的文件自帶的名字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) {
//下載完成調(diào)用的方法 NSLog(@"下載完成:");
NSLog(@"=====%@--%@",response,filePath);
}];
//開始啟動任務(wù)
[task resume];
}
下載完成在沙盒中可以看到歌曲已經(jīng)下載下來。

如果這篇文章對您有一丟丟幫助 請給我點個心哦。
未完待續(xù)。。。。。