一.簡單介紹
iOS7之后新加了NSURLSession來處理網(wǎng)絡(luò)請求
NSURLSession 優(yōu)勢
- 后臺上傳和下載:只需在創(chuàng)建NSURLSession的時候配置一個選項鄙陡,就能得到后臺網(wǎng)絡(luò)的所有好處。這樣可以延長電池壽命春缕,并且還支持UIKit的多task,在進程間使用相同的委托模型闺鲸。
- 能夠暫停和恢復(fù)網(wǎng)絡(luò)操作:使用NSURLSession API能夠暫停规辱,停止知押,恢復(fù)所有的網(wǎng)絡(luò)任務(wù)肥橙,再也完全不需要子類化NSOperation魄宏。
- 可配置的容器:對于NSURLSession里面的requests來說,每個NSURLSession都是可配置的容器存筏。舉個例來說宠互,假如你需要設(shè)置HTTP header選項,你只用做一次椭坚,session里面的每個request就會有同樣的配置予跌。
- 提高認證處理:認證是在一個指定的連接基礎(chǔ)上完成的。在使用NSURLConnection時善茎,如果發(fā)出一個訪問券册,會返回一個任意的request。此時垂涯,你就不能確切的知道哪個request收到了訪問烁焙。而在NSURLSession中,就能用代理處理認證集币。
- 豐富的代理模式:在處理認證的時候考阱,NSURLConnection有一些基于異步的block方法翠忠,但是它的代理方法就不能處理認證鞠苟,不管請求是成功或是失敗。在NSURLSession中秽之,可以混合使用代理和block方法處理認證当娱。
- 上傳和下載通過文件系統(tǒng):它鼓勵將數(shù)據(jù)(文件內(nèi)容)從元數(shù)據(jù)(URL和settings)中分離出來。
二.過程
1.NSURL 2.NSURLRequest 3.NSURLSession 4.NSURLSessionDataTask
NSURLSessionTask繼承關(guān)系
三.例子
- get請求
-(void)getRequest
{
NSString*webPath = [NSStringstringWithFormat:@"http://gc.ditu.aliyun.com/geocoding?a=泰州市"];
webPath = [webPathstringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSetURLQueryAllowedCharacterSet]];
NSURL*url = [NSURLURLWithString:webPath];
NSURLRequest*request =[NSURLRequestrequestWithURL:url];
NSURLSession*session = [NSURLSessionsharedSession];
NSURLSessionDataTask*dataTask = [sessiondataTaskWithRequest:requestcompletionHandler:^(NSData*_Nullabledata,NSURLResponse*_Nullableresponse,NSError*_Nullableerror) {
if(error ==nil){
NSDictionary*dic = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingMutableContainerserror:nil];
NSLog(@"%@",dic);
}
}];
[dataTaskresume];
}
- post請求
-(void)postRequest
{
NSString*webPath = [NSStringstringWithFormat:@"http://gc.ditu.aliyun.com/geocoding?a=泰州市"];
webPath = [webPathstringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSetURLQueryAllowedCharacterSet]];
NSURL*url = [NSURLURLWithString:webPath];
NSMutableURLRequest*request = [NSMutableURLRequestrequestWithURL:url];
request.HTTPMethod=@"post";
request.HTTPBody= [@"a=臺州市"dataUsingEncoding:NSUTF8StringEncoding];
NSURLSession*session = [NSURLSessionsharedSession];
NSURLSessionDataTask*dataTask = [sessiondataTaskWithRequest:requestcompletionHandler:^(NSData*_Nullabledata,NSURLResponse*_Nullableresponse,NSError*_Nullableerror) {
if(error ==nil){
NSDictionary*dic = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingMutableContainerserror:nil];
NSLog(@"%@",dic);
}
}];
[dataTaskresume];
}
- 下載文件
-(void)downloadRequest
{
//[http://ftp.blizzard.com/pub/starcraft/patches/Mac/StarCraft_v116_OSX.zip](http://ftp.blizzard.com/pub/starcraft/patches/Mac/StarCraft_v116_OSX.zip)
NSURL*url = [NSURLURLWithString:[@"http://ftp.blizzard.com/pub/starcraft/patches/Mac/StarCraft_v116_OSX.zip"stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSetURLQueryAllowedCharacterSet]]];
NSMutableURLRequest*request = [NSMutableURLRequestrequestWithURL:url];
NSURLSession*session = [NSURLSessionsessionWithConfiguration: [NSURLSessionConfigurationdefaultSessionConfiguration]delegate:selfdelegateQueue:[NSOperationQueuemainQueue]];
NSURLSessionDataTask*dataTask = [sessiondataTaskWithRequest:request];
[dataTaskresume];
}
-(void)URLSession:(NSURLSession*)session dataTask:(NSURLSessionDataTask*)dataTask didReceiveResponse:(nonnullNSURLResponse*)response completionHandler:(nonnullvoid(^)(NSURLSessionResponseDisposition))completionHandler
{
completionHandler(NSURLSessionResponseAllow);
}
-(void)URLSession:(NSURLSession*)session dataTask:(NSURLSessionDataTask*)dataTask didReceiveData:(NSData*)data
{
[_resultDataappendData:data];
}
-(void)URLSession:(NSURLSession*)session task:(NSURLSessionTask*)task didCompleteWithError:(NSError*)error
{
if(error ==nil)
{
NSLog(@"%f",[_resultDatalength]/1024.0);
}
}