在iOS7以後,NSURLSession做爲系統推薦使用的HTTP請求框架,在進行前臺請求的狀況下,NSURLSession與NSURLConnection並沒有太大差別,對於後臺的請求,NSURLSession更加靈活的優點就將展示無遺。編程
NSURLSession類提供3中Session類型:緩存
Default類型:提供前臺請求相關方法,支持配置緩存,身份憑證等。網絡
Ephemeral類型:即時的請求類型,不使用緩存,身份憑證等。session
Background:後臺類型,支持在後臺完成請求任務。app
在NSURLSession中添加的請求任務支持3中類型:框架
數據任務:使用NSData對象進行數據的發送和獲取,通常用於短數據的任務。ide
下載任務:從文件下載數據,支持後臺下載。spa
上傳任務:以文件的形式上傳數據,支持後臺上傳。代理
經過NSURLSessionConfiguration類對象對NSURLSession進行配置與建立,建立和配NSURLSession的示例代碼以下:code
//默認類型的 NSURLSessionConfiguration * defaultConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; //即時類型的 NSURLSessionConfiguration * ephemeralConfiguration = [NSURLSessionConfiguration ephemeralSessionConfiguration]; //後臺類型的 NSURLSessionConfiguration * backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"SessionId"]; //建立並設置session NSURLSession * defaultSession = [NSURLSession sessionWithConfiguration:defaultConfiguration]; NSURLSession * ephemeralSession = [NSURLSession sessionWithConfiguration:ephemeralConfiguration]; NSURLSession * backgroundSession = [NSURLSession sessionWithConfiguration:backgroundConfiguration];
NSURLSessionConfiguration還能夠配置如緩存,網絡模式等參數
NSURLSession有兩種方式進行網絡數據的請求,一種是經過block的方式獲取網絡數據,一種是經過代理回調的方式獲取網絡數據。經過block的方式進行請求代碼以下:
//建立session配置對象 NSURLSessionConfiguration * defaultConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; //建立請求對象 NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]; //建立session對象 NSURLSession * defaultSession = [NSURLSession sessionWithConfiguration:defaultConfiguration]; //添加任務 NSURLSessionTask * task= [defaultSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSLog(@"%@",data); }]; //開始任務 [task resume];
使用代理回調的方式進行請求須要遵照以下協議:
@interface ViewController ()<NSURLSessionDataDelegate> @end
將請求代碼修改以下:
NSURLSessionConfiguration * defaultConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]; NSURLSession * defaultSession = [NSURLSession sessionWithConfiguration:defaultConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]]; NSURLSessionTask * task= [defaultSession dataTaskWithRequest:request]; [task resume];
實現代理方法以下:
//開始接受數據 -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{ NSLog(@"=======%@",data); } //接受數據結束 -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{ NSLog(@"完成:error%@",error); }
NSURLSession最大的優點在於其後臺下載的靈活性,使用以下的代碼進行後臺數據下載:
NSURLSessionConfiguration * backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.zyprosoft.backgroundsession"]; NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]; NSURLSession * backgroundSession = [NSURLSession sessionWithConfiguration:backgroundConfiguration delegate:self delegateQueue:nil]; [[backgroundSession downloadTaskWithRequest:request]resume];
在下面的回調方法中能夠進行下載進度的監聽:
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { NSLog(@"######"); }
若是在下載過程當中點擊Home鍵使應用程序進入後臺,NSURLSession的相關代理方法將再也不被回調,可是下載任務依然在進行,當後臺下載完成後會與AppDelegate進行交互,會調用AppDelegate中的以下方法:
-(void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler{ NSLog(@"1111"); }
以後應用程序在後臺會調用NSURLSesstion代理的以下方法來通知下載結果:
//此方法不管成功失敗都會調用 -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{ NSLog(@"完成:error%@",error); } //此方法只有下載成功纔會調用 文件放在location位置 -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{ }
最後將調用NSURLSesstion的以下方法:
-(void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session { NSLog(@"All tasks are finished"); }
專一技術,熱愛生活,交流技術,也作朋友。
——琿少 QQ羣:203317592