iOS網絡編程之二——NSURLSession的簡單使用

iOS網絡編程之二——NSURLSession的簡單使用

1、NSURLSession簡介

    在iOS7以後,NSURLSession做爲系統推薦使用的HTTP請求框架,在進行前臺請求的狀況下,NSURLSession與NSURLConnection並沒有太大差別,對於後臺的請求,NSURLSession更加靈活的優點就將展示無遺。編程

        1.NSURLSession集合的類型

        NSURLSession類提供3中Session類型:緩存

        Default類型:提供前臺請求相關方法,支持配置緩存,身份憑證等。網絡

        Ephemeral類型:即時的請求類型,不使用緩存,身份憑證等。session

        Background:後臺類型,支持在後臺完成請求任務。app

        2.NSURLSession任務的類型

        在NSURLSession中添加的請求任務支持3中類型:框架

        數據任務:使用NSData對象進行數據的發送和獲取,通常用於短數據的任務。ide

        下載任務:從文件下載數據,支持後臺下載。spa

        上傳任務:以文件的形式上傳數據,支持後臺上傳。代理

2、建立並配置NSURLSession

        經過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還能夠配置如緩存,網絡模式等參數

3、使用NSURLSession進行網絡請求的兩種方式

        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);
}

4、進行後臺下載任務

        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

相關文章
相關標籤/搜索