文 || 張賀
AFNetworking基本使用
使用AFHTTPSessionManager發(fā)送請求
//1.創(chuàng)建一個請求管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//2.要傳的參數(shù)
NSDictionary *dic = @{
@"username":@"520it",
@"pwd":@"520it"
};
//3.GET請求
[manager GET:@"http://120.25.226.186:32812/login" parameters:dic progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"請求成功:%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"請求失敗:%@",error);
}];
//POST請求
[manager POST:@"http://120.25.226.186:32812/login" parameters:dic progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"請求成功:%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"請求成功:%@",error);
}];
使用AFHTTPSessionManager實現(xiàn)下載進(jìn)度的監(jiān)聽
//1.創(chuàng)建一個請求管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_03.png"]];
//這個方法返回的是一個NSURLSessionDownloadTask對象同眯,需要手動resume
NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
NSLog(@"%f",1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
//targetPath是默認(rèn)的一個文件下載的路徑
//類似這樣:file:///Users/zhanghe/Library/Developer/CoreSimulator/Devices/4BDBC7DD-6933-4BFD-BA4D-B074FB03D13D/data/Containers/Data/Application/797FA30C-3BF1-4300-8B40-5E85D16B3D08/tmp/CFNetworkDownload_lK6q9X.tmp
//需要返回一個你希望把文件保存在哪的url
NSString *str = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask , YES)lastObject];
NSURL *url = [NSURL fileURLWithPath:str];
NSLog(@"%@",url);
return url;
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
//這里的filePath就是上一個block返回的url
}];
[task resume];
打印結(jié)果:
下載進(jìn)度的監(jiān)聽
AFNetworking序列化
1.AFN它內(nèi)部默認(rèn)把服務(wù)器響應(yīng)的數(shù)據(jù)當(dāng)做json來進(jìn)行解析,所以如果服務(wù)器返回給我的不是JSON數(shù)據(jù)那么請求報錯,這個時候需要設(shè)置AFN對響應(yīng)信息的解析方式菱农。AFN提供了三種解析響應(yīng)信息的方式循未,分別是:
1)AFXMLParserResponseSerializer----XML
- AFHTTPResponseSerializer-----------默認(rèn)二進(jìn)制響應(yīng)數(shù)據(jù)
3)AFJSONResponseSerializer----------JSON
2.還有一種情況就是服務(wù)器返回給我們的數(shù)據(jù)格式不太一致(開發(fā)者工具Content-Type:text/xml),那么這種情況也有可能請求不成功秫舌。解決方法:
1) 直接在源代碼中修改,添加相應(yīng)的Content-Type
2) 拿到這個屬性嫂粟,添加到它的集合中
//1.創(chuàng)建一個請求管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//修改序列化方式
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
//如果不是JSON也不是XML赋元,就用
// manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//2.要傳的參數(shù)
NSDictionary *dic = @{
@"username":@"520it",
@"pwd":@"520it",
@"type":@"XML"
};
//3.GET請求
[manager GET:@"http://120.25.226.186:32812/login" parameters:dic progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//如果服務(wù)器返回的數(shù)據(jù)格式是XML,這里的responseObject為NSXMLParser對象
NSLog(@"請求成功:%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"請求失敽萏骸:%@",error);
}];
使用AFNetworkReachabilityManager監(jiān)聽網(wǎng)絡(luò)狀態(tài)
說明:可以使用AFN框架中的AFNetworkReachabilityManager來監(jiān)聽網(wǎng)絡(luò)狀態(tài)的改變褥芒,也可以利用蘋果提供的Reachability來監(jiān)聽锰扶。建議在開發(fā)中直接使用AFN框架處理。
//創(chuàng)建網(wǎng)絡(luò)監(jiān)聽管理者
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
/*
AFNetworkReachabilityStatusUnknown 未知,
AFNetworkReachabilityStatusNotReachable 沒有聯(lián)網(wǎng),
AFNetworkReachabilityStatusReachableViaWWAN 3G,
AFNetworkReachabilityStatusReachableViaWiFi WiFi,
**/
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"未知");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"沒有聯(lián)網(wǎng)");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"3G");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WiFi");
break;
default:
break;
}
}];
[manager startMonitoring];
使用蘋果提供的Reachability來檢測網(wǎng)絡(luò)狀態(tài)罕偎,如果要持續(xù)監(jiān)聽網(wǎng)絡(luò)狀態(tài)的概念颜及,需要結(jié)合通知一起使用蹂楣。
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//1.注冊一個通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkChange) name:kReachabilityChangedNotification object:nil];
//2.拿到一個對象,然后調(diào)用開始監(jiān)聽方法
Reachability *r = [Reachability reachabilityForInternetConnection];
[r startNotifier];
//持有該對象肄扎,不要讓該對象釋放掉
self.r = r;
}
//當(dāng)控制器釋放的時候犯祠,移除通知的監(jiān)聽
-(void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
-(void)networkChange
{
//獲取當(dāng)前網(wǎng)絡(luò)的狀態(tài)
if([Reachability reachabilityForLocalWiFi].currentReachabilityStatus != NotReachable)
{
NSLog(@"當(dāng)前網(wǎng)絡(luò)為WIFI");
}else if ([Reachability reachabilityForInternetConnection].currentReachabilityStatus != NotReachable)
{
NSLog(@"當(dāng)前網(wǎng)絡(luò)為手機自帶網(wǎng)絡(luò)");
}else
{
NSLog(@"當(dāng)前沒有網(wǎng)絡(luò)");
}
}