ios開發網路學八:NSURLSession相關代理方法

來源:互聯網
上載者:User

標籤:

#import "ViewController.h"@interface ViewController ()<NSURLSessionDataDelegate>/** 接受響應體資訊 */@property (nonatomic, strong) NSMutableData *fileData;@end@implementation ViewController-(NSMutableData *)fileData{    if (_fileData == nil) {        _fileData = [NSMutableData data];    }    return _fileData;}-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    //1.url    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=123&pwd=123&type=JSON"];        //2.建立請求對象    NSURLRequest *request = [NSURLRequest requestWithURL:url];        //3.建立會話對象,設定代理    /*     第一個參數:配置資訊 [NSURLSessionConfiguration defaultSessionConfiguration]     第二個參數:代理     第三個參數:設定代理方法在哪個線程中調用     */    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];        //4.建立Task    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];        //5.執行Task    [dataTask resume];}#pragma mark ----------------------#pragma mark NSURLSessionDataDelegate/** *  1.接收到伺服器的響應 它預設會取消該請求 * *  @param session           會話對象 *  @param dataTask          請求任務 *  @param response          回應標頭資訊 *  @param completionHandler 回調 傳給系統 */-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{    NSLog(@"%s",__func__);        /*     NSURLSessionResponseCancel = 0,取消 預設     NSURLSessionResponseAllow = 1, 接收     NSURLSessionResponseBecomeDownload = 2, 變成下載任務     NSURLSessionResponseBecomeStream        變成流     */    completionHandler(NSURLSessionResponseAllow);}/** *  接收到伺服器返回的資料 調用多次 * *  @param session           會話對象 *  @param dataTask          請求任務 *  @param data              本次下載的資料 */-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{     NSLog(@"%s",__func__);        //拼接資料    [self.fileData appendData:data];}/** *  請求結束或者是失敗的時候調用 * *  @param session           會話對象 *  @param dataTask          請求任務 *  @param error             錯誤資訊 */-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{     NSLog(@"%s",__func__);        //解析資料    NSLog(@"%@",[[NSString alloc]initWithData:self.fileData encoding:NSUTF8StringEncoding]);}@end

(1)建立NSURLSession對象,設定代理(預設配置)

```objc

 //1.建立NSURLSession,並設定代理

    /*

     第一個參數:session對象的全域配置設定,一般使用預設配置就可以

     第二個參數:誰成為session對象的代理

     第三個參數:代理方法在哪個隊列中執行(在哪個線程中調用),如果是主隊列那麼在主線程中執行,如果是非主隊列,那麼在子線程中執行

     */

    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];

```

(2)根據Session對象建立一個NSURLSessionDataTask任務(post和get選擇)

```objc

//建立task

NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_01.png"];

 

//注意:如果要發送POST請求,那麼請使用dataTaskWithRequest,設定一些要求標頭資訊

NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url];

```

(3)執行任務(其它方法,如暫停、取消等)

```objc

    //啟動task

    //[dataTask resume];

    //其它方法,如取消任務,暫停任務等

    //[dataTask cancel];

    //[dataTask suspend];

```

(4)遵守代理協議,實現代理方法(3個相關的代理方法)

```objc

/*

 1.當接收到伺服器響應的時候調用

     session:發送請求的session對象

     dataTask:根據NSURLSession建立的task任務

     response:伺服器響應資訊(回應標頭)

     completionHandler:通過該block回調,告訴伺服器端是否接收返回的資料

 */

-(void)URLSession:(nonnull NSURLSession *)session dataTask:(nonnull NSURLSessionDataTask *)dataTask didReceiveResponse:(nonnull NSURLResponse *)response completionHandler:(nonnull void (^)(NSURLSessionResponseDisposition))completionHandler

 

/*

 2.當接收到伺服器返回的資料時調用

 該方法可能會被調用多次

 */

-(void)URLSession:(nonnull NSURLSession *)session dataTask:(nonnull NSURLSessionDataTask *)dataTask didReceiveData:(nonnull NSData *)data

 

/*

 3.當請求完成之後調用該方法

 不論是請求成功還是請求失敗都調用該方法,如果請求失敗,那麼error對象有值,否則那麼error對象為空白

 */

-(void)URLSession:(nonnull NSURLSession *)session task:(nonnull NSURLSessionTask *)task didCompleteWithError:(nullable NSError *)error

```

(5)當接收到伺服器響應的時候,告訴伺服器接收資料(調用block)

```objc

//預設情況下,當接收到伺服器響應之後,伺服器認為用戶端不需要接收資料,所以後面的代理方法不會調用

    //如果需要繼續接收伺服器返回的資料,那麼需要調用block,並傳入對應的策略

 

    /*

        NSURLSessionResponseCancel = 0, 取消任務

        NSURLSessionResponseAllow = 1,  接收任務

        NSURLSessionResponseBecomeDownload = 2, 轉變成下載

        NSURLSessionResponseBecomeStream NS_ENUM_AVAILABLE(10_11, 9_0) = 3, 轉變成流

    */

 

    completionHandler(NSURLSessionResponseAllow);

```

 

---

 

ios開發網路學八:NSURLSession相關代理方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.