1.NSURLConnection使用
1.1 NSURLConnection同步請求(GET)
(1)步驟
01 設(shè)置請求路徑
02 創(chuàng)建請求對象(默認(rèn)是GET請求,且已經(jīng)默認(rèn)包含了請求頭)
03 使用NSURLSession sendsync方法發(fā)送網(wǎng)絡(luò)請求
04 接收到服務(wù)器的響應(yīng)后,解析響應(yīng)體
(2)相關(guān)代碼
//1.確定請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=XML"];
// NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"];
//2.創(chuàng)建一個請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.把請求發(fā)送給服務(wù)器
//sendSynchronousRequest 阻塞式的方法,會卡住線程
NSHTTPURLResponse *response = nil;
NSError *error = nil;
/*
第一個參數(shù):請求對象
第二個參數(shù):響應(yīng)頭信息,當(dāng)該方法執(zhí)行完畢之后,該參數(shù)被賦值
第三個參數(shù):錯誤信息,如果請求失敗,則error有值
*/
//該方法是阻塞式的,會卡住線程
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
//4.解析服務(wù)器返回的數(shù)據(jù)
NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
1.2 NSURLConnection異步請求(GET-SendAsync)
(1)相關(guān)說明
01 該方法不會卡住當(dāng)前線程,網(wǎng)絡(luò)請求任務(wù)是異步執(zhí)行的
(2)相關(guān)代碼
//1.確定請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it"];
//2.創(chuàng)建一個請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.把請求發(fā)送給服務(wù)器,發(fā)送一個異步請求
/*
第一個參數(shù):請求對象
第二個參數(shù):回調(diào)方法在哪個線程中執(zhí)行,如果是主隊(duì)列則block在主線程中執(zhí)行,非主隊(duì)列則在子線程中執(zhí)行
第三個參數(shù):completionHandlerBlock塊:接受到響應(yīng)的時(shí)候執(zhí)行該block中的代碼
response:響應(yīng)頭信息
data:響應(yīng)體
connectionError:錯誤信息,如果請求失敗,那么該參數(shù)有值
*/
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * __nullable response, NSData * __nullable data, NSError * __nullable connectionError) {
//4.解析服務(wù)器返回的數(shù)據(jù)
NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
//轉(zhuǎn)換并打印響應(yīng)頭信息
NSHTTPURLResponse *r = (NSHTTPURLResponse *)response;
NSLog(@"--%zd---%@--",r.statusCode,r.allHeaderFields);
}];
1.3 NSURLConnection異步請求(GET-代理)
(1)步驟
01 確定請求路徑
02 創(chuàng)建請求對象
03 創(chuàng)建NSURLConnection對象并設(shè)置代理
04 遵守NSURLConnectionDataDelegate協(xié)議,并實(shí)現(xiàn)相應(yīng)的代理方法
05 在代理方法中監(jiān)聽網(wǎng)絡(luò)請求的響應(yīng)
(2)設(shè)置代理的幾種方法
/*
設(shè)置代理的第一種方式:自動發(fā)送網(wǎng)絡(luò)請求
[[NSURLConnection alloc]initWithRequest:request delegate:self];
*/
/*
設(shè)置代理的第二種方式:
第一個參數(shù):請求對象
第二個參數(shù):誰成為NSURLConnetion對象的代理
第三個參數(shù):是否馬上發(fā)送網(wǎng)絡(luò)請求,如果該值為YES則立刻發(fā)送,如果為NO則不會發(fā)送網(wǎng)路請求
NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];
//調(diào)用該方法控制網(wǎng)絡(luò)請求的發(fā)送
[conn start];
*/
//設(shè)置代理的第三種方式:使用類方法設(shè)置代理,會自動發(fā)送網(wǎng)絡(luò)請求
NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
//取消網(wǎng)絡(luò)請求
//[conn cancel];
(3)相關(guān)的代理方法
/*
1.當(dāng)接收到服務(wù)器響應(yīng)的時(shí)候調(diào)用
第一個參數(shù)connection:監(jiān)聽的是哪個NSURLConnection對象
第二個參數(shù)response:接收到的服務(wù)器返回的響應(yīng)頭信息
*/
- (void)connection:(nonnull NSURLConnection *)connection didReceiveResponse:(nonnull NSURLResponse *)response
/*
2.當(dāng)接收到數(shù)據(jù)的時(shí)候調(diào)用,該方法會被調(diào)用多次
第一個參數(shù)connection:監(jiān)聽的是哪個NSURLConnection對象
第二個參數(shù)data:本次接收到的服務(wù)端返回的二進(jìn)制數(shù)據(jù)(可能是片段)
*/
- (void)connection:(nonnull NSURLConnection *)connection didReceiveData:(nonnull NSData *)data
/*
3.當(dāng)服務(wù)端返回的數(shù)據(jù)接收完畢之后會調(diào)用
通常在該方法中解析服務(wù)器返回的數(shù)據(jù)
*/
-(void)connectionDidFinishLoading:(nonnull NSURLConnection *)connection
/*4.當(dāng)請求錯誤的時(shí)候調(diào)用(比如請求超時(shí))
第一個參數(shù)connection:NSURLConnection對象
第二個參數(shù):網(wǎng)絡(luò)請求的錯誤信息,如果請求失敗,則error有值
*/
- (void)connection:(nonnull NSURLConnection *)connection didFailWithError:(nonnull NSError *)error
(4)其它知識點(diǎn)
01 關(guān)于消息彈窗第三方框架的使用
SVProgressHUD
02 字符串截取相關(guān)方法
- (NSRange)rangeOfString:(NSString *)searchString;
- (NSString *)substringWithRange:(NSRange)range;
1.4 NSURLConnection發(fā)送POST請求
(1)發(fā)送POST請求步驟
a.確定URL路徑
b.創(chuàng)建請求對象(可變對象)
c.修改請求對象的方法為POST,設(shè)置請求體(Data)
d.發(fā)送一個異步請求
e.補(bǔ)充:設(shè)置請求超時(shí),處理錯誤信息,設(shè)置請求頭(如獲取客戶端的版本等等,請求頭是可設(shè)置可不設(shè)置的)
(2)相關(guān)代碼
//1.確定請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"];
//2.創(chuàng)建請求對象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//2.1更改請求方法
request.HTTPMethod = @"POST";
//2.2設(shè)置請求體
request.HTTPBody = [@"username=520it&pwd=520it" dataUsingEncoding:NSUTF8StringEncoding];
//2.3請求超時(shí)
request.timeoutInterval = 5;
//2.4設(shè)置請求頭
[request setValue:@"ios 9.0" forHTTPHeaderField:@"User-Agent"];
//3.發(fā)送請求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * __nullable response, NSData * __nullable data, NSError * __nullable connectionError) {
//4.解析服務(wù)器返回的數(shù)據(jù)
if (connectionError) {
NSLog(@"--請求失敗-");
}else
{
NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
}
}];
1.5 URL中文轉(zhuǎn)碼問題 //1.確定請求路徑
NSString *urlStr = @"http://120.25.226.186:32812/login2?username=小碼哥&pwd=520it";
NSLog(@"%@",urlStr);
//中文轉(zhuǎn)碼操作
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@",urlStr);
NSURL *url = [NSURL URLWithString:urlStr];
2.0 JSON解析
2.1 JSON簡單介紹
001 問:什么是JSON 答:
(1)JSON是一種輕量級的數(shù)據(jù)格式,一般用于數(shù)據(jù)交互
(2)服務(wù)器返回給客戶端的數(shù)據(jù),一般都是JSON格式或者XML格式(文件下載除外)
002 相關(guān)說明
(1)JSON的格式很像OC中的字典和數(shù)組
(2)標(biāo)準(zhǔn)JSON格式key必須是雙引號
003 JSON解析方案
a.第三方框架 JSONKit\SBJSON\TouchJSON
b.蘋果原生(NSJSONSerialization)
2.2 JSON解析相關(guān)代碼
(1)json數(shù)據(jù)->OC對象
//把json數(shù)據(jù)轉(zhuǎn)換為OC對象
-(void)jsonToOC
{
//1. 確定url路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=33&pwd=33&type=JSON"];
//2.創(chuàng)建一個請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.使用NSURLSession發(fā)送一個異步請求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//4.當(dāng)接收到服務(wù)器響應(yīng)的數(shù)據(jù)后,解析數(shù)據(jù)(JSON--->OC)
/*
第一個參數(shù):要解析的JSON數(shù)據(jù),是NSData類型也就是二進(jìn)制數(shù)據(jù)
第二個參數(shù): 解析JSON的可選配置參數(shù)
NSJSONReadingMutableContainers 解析出來的字典和數(shù)組是可變的
NSJSONReadingMutableLeaves 解析出來的對象中的字符串是可變的 iOS7以后有問題
NSJSONReadingAllowFragments 被解析的JSON數(shù)據(jù)如果既不是字典也不是數(shù)組, 那么就必須使用這個
*/
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSLog(@"%@",dict);
}];
}
(2)OC對象->JSON對象
//1.要轉(zhuǎn)換成JSON數(shù)據(jù)的OC對象*這里是一個字典
NSDictionary *dictM = @{
@"name":@"wendingding",
@"age":@100,
@"height":@1.72
};
//2.OC->JSON
/*
注意:可以通過+ (BOOL)isValidJSONObject:(id)obj;方法判斷當(dāng)前OC對象能否轉(zhuǎn)換為JSON數(shù)據(jù)
具體限制:
1.obj 是NSArray 或 NSDictionay 以及他們派生出來的子類
2.obj 包含的所有對象是NSString,NSNumber,NSArray,NSDictionary 或NSNull
3.字典中所有的key必須是NSString類型的
4.NSNumber的對象不能是NaN或無窮大
*/
/*
第一個參數(shù):要轉(zhuǎn)換成JSON數(shù)據(jù)的OC對象,這里為一個字典
第二個參數(shù):NSJSONWritingPrettyPrinted對轉(zhuǎn)換之后的JSON對象進(jìn)行排版,無意義
*/
NSData *data = [NSJSONSerialization dataWithJSONObject:dictM options:NSJSONWritingPrettyPrinted error:nil];
//3.打印查看Data是否有值
/*
第一個參數(shù):要轉(zhuǎn)換為STring的二進(jìn)制數(shù)據(jù)
第二個參數(shù):編碼方式,通常采用NSUTF8StringEncoding
*/
NSString *strM = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",strM);
(3)OC對象和JSON數(shù)據(jù)格式之間的一一對應(yīng)關(guān)系
//OC對象和JSON數(shù)據(jù)之間的一一對應(yīng)關(guān)系
-(void)oCWithJSON
{
//JSON的各種數(shù)據(jù)格式
//NSString *test = @"\"wendingding\"";
//NSString *test = @"true";
NSString *test = @"{\"name\":\"wendingding\"}";
//把JSON數(shù)據(jù)->OC對象,以便查看他們之間的一一對應(yīng)關(guān)系
//注意點(diǎn):如何被解析的JSON數(shù)據(jù)如果既不是字典也不是數(shù)組(比如是NSString), 那么就必須使用這NSJSONReadingAllowFragments
id obj = [NSJSONSerialization JSONObjectWithData:[test dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@", [obj class]);
/* JSON數(shù)據(jù)格式和OC對象的一一對應(yīng)關(guān)系
{} -> 字典
[] -> 數(shù)組
"" -> 字符串
10/10.1 -> NSNumber
true/false -> NSNumber
null -> NSNull
*/
}
}
(4)如何查看復(fù)雜的JSON數(shù)據(jù)
方法一:
在線格式化http://tool.oschina.net/codeformat/json
方法二:
把解析后的數(shù)據(jù)寫plist文件,通過plist文件可以直觀的查看JSON的層次結(jié)構(gòu)。
[dictM writeToFile:@"/Users/文頂頂/Desktop/videos.plist" atomically:YES];
(5)視頻的簡單播放
//0.需要導(dǎo)入系統(tǒng)框架
#import <MediaPlayer/MediaPlayer.h>
//1.拿到該cell對應(yīng)的數(shù)據(jù)字典
XMGVideo *video = self.videos[indexPath.row];
NSString *videoStr = [@"http://120.25.226.186:32812" stringByAppendingPathComponent:video.url];
//2.創(chuàng)建一個視頻播放器
MPMoviePlayerViewController *vc = [[MPMoviePlayerViewController alloc]initWithContentURL:[NSURL URLWithString:videoStr]];
//3.present播放控制器
[self presentViewController:vc animated:YES completion:nil];
2.3 字典轉(zhuǎn)模型框架
(1)相關(guān)框架
a.Mantle 需要繼承自MTModel
b.JSONModel 需要繼承自JSONModel
c.MJExtension 不需要繼承,無代碼侵入性
(2)自己設(shè)計(jì)和選擇框架時(shí)需要注意的問題
a.侵入性
b.易用性,是否容易上手
c.擴(kuò)展性,很容易給這個框架增加新的功能
(3)MJExtension框架的簡單使用
//1.把字典數(shù)組轉(zhuǎn)換為模型數(shù)組
//使用MJExtension框架進(jìn)行字典轉(zhuǎn)模型
self.videos = [XMGVideo objectArrayWithKeyValuesArray:videoArray];
//2.重命名模型屬性的名稱
//第一種重命名屬性名稱的方法,有一定的代碼侵入性
//設(shè)置字典中的id被模型中的ID替換
+(NSDictionary *)replacedKeyFromPropertyName
{
return @{
@"ID":@"id"
};
}
//第二種重命名屬性名稱的方法,代碼侵入性為零
[XMGVideo setupReplacedKeyFromPropertyName:^NSDictionary *{
return @{
@"ID":@"id"
};
}];
//3.MJExtension框架內(nèi)部實(shí)現(xiàn)原理-運(yùn)行時(shí)
3.0 XML解析
3.1 XML簡單介紹
(1) XML:可擴(kuò)展標(biāo)記語言
a.語法
b.XML文檔的三部分(聲明、元素和屬性)
c.其它注意點(diǎn)(注意不能交叉包含、空行換行、XML文檔只能有一個根元素等)
(2) XML解析
a.XML解析的兩種方式
001 SAX:從根元素開始,按順序一個元素一個元素的往下解析,可用于解析大、小文件
002 DOM:一次性將整個XML文檔加載到內(nèi)存中,適合較小的文件
b.解析XML的工具
001 蘋果原生NSXMLParser:使用SAX方式解析,使用簡單
002 第三方框架
libxml2:純C語言的,默認(rèn)包含在iOS SDK中,同時(shí)支持DOM和SAX的方式解析
GDataXML:采用DOM方式解析,該框架由Goole開發(fā),是基于xml2的
3.2 XML解析
(1)使用NSXMLParser解析XML步驟和代理方法
//解析步驟:
//4.1 創(chuàng)建一個解析器
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
//4.2 設(shè)置代理
parser.delegate = self;
//4.3 開始解析
[parser parse];
-----------------------------------------
//1.開始解析XML文檔
-(void)parserDidStartDocument:(nonnull NSXMLParser *)parser
//2.開始解析XML中某個元素的時(shí)候調(diào)用,比如<video>
-(void)parser:(nonnull NSXMLParser *)parser didStartElement:(nonnull NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(nonnull NSDictionary<NSString *,NSString *> *)attributeDict
{
if ([elementName isEqualToString:@"videos"]) {
return;
}
//字典轉(zhuǎn)模型
XMGVideo *video = [XMGVideo objectWithKeyValues:attributeDict];
[self.videos addObject:video];
}
//3.當(dāng)某個元素解析完成之后調(diào)用,比如</video>
-(void)parser:(nonnull NSXMLParser *)parser didEndElement:(nonnull NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName
//4.XML文檔解析結(jié)束
-(void)parserDidEndDocument:(nonnull NSXMLParser *)parser
(2)使用GDataParser解析XML的步驟和方法
//4.0 配置環(huán)境
// 001 先導(dǎo)入框架,然后按照框架使用注釋配置環(huán)境
// 002 GDataXML框架是MRC的,所以還需要告訴編譯器以MRC的方式處理GDataXML的代碼
//4.1 加載XML文檔(使用的是DOM的方式一口氣把整個XML文檔都吞下)
GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:data options:kNilOptions error:nil];
//4.2 獲取XML文檔的根元素,根據(jù)根元素取出XML中的每個子元素
NSArray * elements = [doc.rootElement elementsForName:@"video"];
//4.3 取出每個子元素的屬性并轉(zhuǎn)換為模型
for (GDataXMLElement *ele in elements) {
XMGVideo *video = [[XMGVideo alloc]init];
video.name = [ele attributeForName:@"name"].stringValue;
video.length = [ele attributeForName:@"length"].stringValue.integerValue;
video.url = [ele attributeForName:@"url"].stringValue;
video.image = [ele attributeForName:@"image"].stringValue;
video.ID = [ele attributeForName:@"id"].stringValue;
//4.4 把轉(zhuǎn)換好的模型添加到tableView的數(shù)據(jù)源self.videos數(shù)組中
[self.videos addObject:video];
}
3.3 多值參數(shù)和中文輸出問題
(1)多值參數(shù)如何設(shè)置請求路徑
//多值參數(shù)
/*
如果一個參數(shù)對應(yīng)著多個值,那么直接按照"參數(shù)=值&參數(shù)=值"的方式拼接
*/
-(void)test
{
//1.確定URL
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/weather?place=Beijing&place=Guangzhou"];
//2.創(chuàng)建請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.發(fā)送請求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//4.解析
NSLog(@"%@",[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
}];
}
(2)如何解決字典和數(shù)組中輸出亂碼的問題
答:給字典和數(shù)組添加一個分類,重寫descriptionWithLocale方法,在該方法中拼接元素格式化輸出。
-(nonnull NSString *)descriptionWithLocale:(nullable id)locale
4.0 文件下載
4.1 小文件下載
(1)第一種方式(NSData)
//使用NSDta直接加載網(wǎng)絡(luò)上的url資源(不考慮線程)
-(void)dataDownload
{
//1.確定資源路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_01.png"];
//2.根據(jù)URL加載對應(yīng)的資源
NSData *data = [NSData dataWithContentsOfURL:url];
//3.轉(zhuǎn)換并顯示數(shù)據(jù)
UIImage *image = [UIImage imageWithData:data];
self.imageView.image = image;
}
(2)第二種方式(NSURLConnection-sendAsync)
//使用NSURLConnection發(fā)送異步請求下載文件資源
-(void)connectDownload
{
//1.確定請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_01.png"];
//2.創(chuàng)建請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.使用NSURLConnection發(fā)送一個異步請求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//4.拿到并處理數(shù)據(jù)
UIImage *image = [UIImage imageWithData:data];
self.imageView.image = image;
}];
}
(3)第三種方式(NSURLConnection-delegate)
//使用NSURLConnection設(shè)置代理發(fā)送異步請求的方式下載文件
-(void)connectionDelegateDownload
{
//1.確定請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_01.mp4"];
//2.創(chuàng)建請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.使用NSURLConnection設(shè)置代理并發(fā)送異步請求
[NSURLConnection connectionWithRequest:request delegate:self];
}
#pragma mark--NSURLConnectionDataDelegate
//當(dāng)接收到服務(wù)器響應(yīng)的時(shí)候調(diào)用,該方法只會調(diào)用一次
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
//創(chuàng)建一個容器,用來接收服務(wù)器返回的數(shù)據(jù)
self.fileData = [NSMutableData data];
//獲得當(dāng)前要下載文件的總大?。ㄍㄟ^響應(yīng)頭得到)
NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
self.totalLength = res.expectedContentLength;
NSLog(@"%zd",self.totalLength);
//拿到服務(wù)器端推薦的文件名稱
self.fileName = res.suggestedFilename;
}
//當(dāng)接收到服務(wù)器返回的數(shù)據(jù)時(shí)會調(diào)用
//該方法可能會被調(diào)用多次
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// NSLog(@"%s",__func__);
//拼接每次下載的數(shù)據(jù)
[self.fileData appendData:data];
//計(jì)算當(dāng)前下載進(jìn)度并刷新UI顯示
self.currentLength = self.fileData.length;
NSLog(@"%f",1.0* self.currentLength/self.totalLength);
self.progressView.progress = 1.0* self.currentLength/self.totalLength;
}
//當(dāng)網(wǎng)絡(luò)請求結(jié)束之后調(diào)用
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
//文件下載完畢把接受到的文件數(shù)據(jù)寫入到沙盒中保存
//1.確定要保存文件的全路徑
//caches文件夾路徑
NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *fullPath = [caches stringByAppendingPathComponent:self.fileName];
//2.寫數(shù)據(jù)到文件中
[self.fileData writeToFile:fullPath atomically:YES];
NSLog(@"%@",fullPath);
}
//當(dāng)請求失敗的時(shí)候調(diào)用該方法
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"%s",__func__);
}