標籤:
一,NSURLConnection的簡單實用
(一).簡單請求過程
/// 1.建立url(資源路徑) NSURL *url = [NSURL URLWithString:@"http://f.hiphotos.baidu.com/image/pic/item/d6ca7bcb0a46f21ff3649fbaf5246b600d33ae83.jpg"]; /// 2.建立請求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; /// 3.發送請求 // 3.1同步請求 NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; /* data 處理 */ // 3.2非同步請求 // 非同步請求需要請求操作放到一個操作隊列(queue)中 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
/* response,data,connectionError 處理 */
}];
代碼說明
1.可以通過以下代碼擷取主隊列(對應的請求在主線程,即使NSURLConnection發非同步請求也是如此)。
NSOperationQueue *queue = [NSOperationQueue mainQueue];// 擷取主隊列
2.(3.1,3.2)的兩個方法現在被蘋果廢棄了,取而代之的是NSURLSession的方法,NSURLSession可以說是NSURLConnection的替代品。
(二).資料解析(json/xml)
json解析(NSJSONSerialization)
// You use the NSJSONSerialization class to convert JSON to Foundation objects // and convert Foundation objects to JSON.(API) // 簡言之,我們用 NSJSONSerialization 這個類 可進行json與oc對象之間的轉換,方法如下: // 1.json 序列化成 oc對象 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; // 2.oc對象 轉 json (不常用) [NSJSONSerialization dataWithJSONObject:object options:NSJSONWritingPrettyPrinted error:nil];
代碼說明
1.通過網路請求獲得的data(json資料)是二進位的資料流,我們需要將其轉換成oc對象來進行操作。
xml解析(NSXMLParser)
<?xml version="1.0" encoding="UTF-8"?> // 檔案聲明(UTF-8編碼) <students> // students、student、name、age都表示:元素(或節點) <student> // <name>ben</name> // ben、m、10表示:元素屬性 <sex>m</sex> <age>10</age> </student> <student> <name>amy</name> <sex>f</sex> <age>9</age> </student> </students>
代碼說明
1.這是一個簡單的xml代碼,包含了xml的三個基本組成部分(聲明、節點、屬性)
{
// 1.建立xml解析器(data是需要解析的資料) NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data]; // 2.設定代理 xmlParser.delegate = self; // 3.啟動解析 [xmlParser parse];
// 4.解析完成,重新整理UI
/* 重新整理UI */;
// 取消解析(實現parser:parseErrorOccurred:方法)
// [xmlParser abortParsing];
}
#pragma mark - NSXMLParser delegate/// Sent by the parser object to the delegate when it begins parsing a document./// 開始解析時調用- (void)parserDidStartDocument:(NSXMLParser *)parser{ NSLog(@"解析開始!");}/// 開始解析元素(節點)市調用- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{ // 解析需要的元素 if ([elementName isEqualToString:@"student"]) { // attributeDict:contains any attributes associated with the element. // Keys are the names of attributes, and values are attribute values // 提取元素的屬性 NSDictionary *dict = attributeDict; /* 在此進行資料字典dict的其他動作 */ } NSLog(@"");}/// completed parsing 時調用- (void)parserDidEndDocument:(NSXMLParser *)parser{ NSLog(@"解析完成!");}/// 出現error的時候調用- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{ NSLog(@"解析錯誤!");}
(三).POST和GET
// url NSURL *url = [[NSURL alloc] initWithString:@"http://f.hiphotos.baidu.com/****"]; // request // NSURLRequest建立的請求是get請求. // NSMutableURLRequest建立的請求預設也是get請求, // 需要調用HTTPMethod才能修改請求方式 NSURLRequest *request_get = [NSURLRequest requestWithURL:url]; // 1.建立request NSMutableURLRequest *request_post = [NSMutableURLRequest requestWithURL:url]; // 2.佈建要求方法為 post request_post.HTTPMethod = @"POST"; // 3.佈建要求體 // HTTPBody是NSData類型,param string需要轉碼 NSString *bodyParam = [NSString stringWithFormat:@"tel=%@&pwd=%@", tel, pwd]; request_post.HTTPBody = [bodyParam dataUsingEncoding:bodyParam]; /* 發送請求 */
代碼說明
1.需要建立post請求需用到NSMutableURLRequest這個類並且需要設定其HTTPMethod為@"POST"。
二,NSURLSession的簡單實用
// **** NSURLSession與NSURLConnection比較
// * NSURLSession 執行個體是個單例
// * NSURLSession 發送請求可直接用URL,不需要額外建立request
// * NSURLSession 需要建立任務(task)
// * NSURLSession 發送請求需要開啟任務
/***** 普通請求 *****/ // 建立session NSURLSession *session =[NSURLSession sharedSession]; // 通過NSURL建立任務(task) NSURLSessionDataTask *task =[session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { /* data、response、error處理 */ }]; // 通過NSURLRequest建立任務(task /* NSURLSessionDataTask *task = [session dataTaskWithRequest:request_get completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { }]; */ // 任務開啟 [task resume]; // 任務暫停 [task suspend];
/***** 下載檔案 請求 *****/ // 建立session NSURLSession *session =[NSURLSession sharedSession]; // 用NSURL建立任務(task) NSURLSessionDownloadTask *task =[session downloadTaskWithURL:url completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) { /* data、response、error處理 */ }]; // 任務開啟 [task resume]; // 任務暫停 [task suspend];
結語:
今天稍微介紹下NSURLConnection和NSURLSession的使用,對於網路請求這隻是剛剛開始,後續將會介紹NSURLConnection和NSURLConnection的代理方法的使用,並會附帶一些demo。
iOS開發-NSURLConnection和NSURLSession的簡單實用