NSURLConnection使用

NSURLConnection使用

4.1 NSURLConnection同步請求(GET-SendSync)

(1)步驟ios

01 設置請求路徑
    02 建立請求對象(默認是GET請求,且已經默認包含了請求頭)
    03 使用NSURLSession sendsync方法發送網絡請求
    04 接收到服務器的響應後,解析響應體

(2)相關代碼服務器

//1.肯定請求路徑
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=XML"];
//    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"];

    //2.建立一個請求對象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    //3.把請求發送給服務器
    //sendSynchronousRequest  (同步)阻塞式的方法,會卡住線程

    NSHTTPURLResponse *response = nil;
    NSError *error = nil;

    /*
     第一個參數:請求對象
     第二個參數:響應頭信息,當該方法執行完畢以後,該參數被賦值
     第三個參數:錯誤信息,若是請求失敗,則error有值
     */
     //該方法是阻塞式的,會卡住線程
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    //4.解析服務器返回的數據
    NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

4.2 NSURLConnection異步請求(GET-SendAsync)

(1)相關說明網絡

01 該方法不會卡住當前線程,網絡請求任務是異步執行的

(2)相關代碼框架

//1.肯定請求路徑
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it"];

    //2.建立一個請求對象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    //3.把請求發送給服務器,發送一個異步請求
    /*
     第一個參數:請求對象
     第二個參數:回調方法在哪一個線程中執行,若是是主隊列則block在主線程中執行,非主隊列則在子線程中執行
     第三個參數:completionHandlerBlock塊:接受到響應的時候執行該block中的代碼
        response:響應頭信息
        data:響應體
        connectionError:錯誤信息,若是請求失敗,那麼該參數有值
     */
    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * __nullable response, NSData * __nullable data, NSError * __nullable connectionError) {

        //4.解析服務器返回的數據
        NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
        //轉換並打印響應頭信息
        NSHTTPURLResponse *r = (NSHTTPURLResponse *)response;
        NSLog(@"--%zd---%@--",r.statusCode,r.allHeaderFields);
    }];

4.3 NSURLConnection異步請求(GET-代理)

(1)步驟異步

01 肯定請求路徑
02 建立請求對象
03 建立NSURLConnection對象並設置代理
04 遵照NSURLConnectionDataDelegate協議,並實現相應的代理方法
05 在代理方法中監聽網絡請求的響應

(2)設置代理的幾種方法ide

/*
     設置代理的第一種方式:自動發送網絡請求
     [[NSURLConnection alloc]initWithRequest:request delegate:self];
     */

    /*
     設置代理的第二種方式:
     第一個參數:請求對象
     第二個參數:誰成爲NSURLConnetion對象的代理
     第三個參數:是否立刻發送網絡請求,若是該值爲YES則馬上發送,若是爲NO則不會發送網路請求
     NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];

     //調用該方法控制網絡請求的發送
     [conn start];
     */

    //設置代理的第三種方式:使用類方法設置代理,會自動發送網絡請求
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
    //取消網絡請求
    //[conn cancel];

(3)相關的代理方法oop

/*
 1.當接收到服務器響應的時候調用
 第一個參數connection:監聽的是哪一個NSURLConnection對象
 第二個參數response:接收到的服務器返回的響應頭信息
 */
- (void)connection:(nonnull NSURLConnection *)connection didReceiveResponse:(nonnull NSURLResponse *)response

/*
 2.當接收到數據的時候調用,該方法會被調用屢次
 第一個參數connection:監聽的是哪一個NSURLConnection對象
 第二個參數data:本次接收到的服務端返回的二進制數據(多是片斷)
 */
- (void)connection:(nonnull NSURLConnection *)connection didReceiveData:(nonnull NSData *)data
/*

 3.當服務端返回的數據接收完畢以後會調用
 一般在該方法中解析服務器返回的數據
 */
-(void)connectionDidFinishLoading:(nonnull NSURLConnection *)connection

/*4.當請求錯誤的時候調用(好比請求超時)
 第一個參數connection:NSURLConnection對象
 第二個參數:網絡請求的錯誤信息,若是請求失敗,則error有值
 */
- (void)connection:(nonnull NSURLConnection *)connection didFailWithError:(nonnull NSError *)error

(4)其它知識點url

01 關於消息彈窗第三方框架的使用
        SVProgressHUD
    02 字符串截取相關方法
    - (NSRange)rangeOfString:(NSString *)searchString;
    - (NSString *)substringWithRange:(NSRange)range;

 NSURLConnection發送POST請求

(1)發送POST請求步驟spa

a.肯定URL路徑
b.建立請求對象(可變對象)
c.修改請求對象的方法爲POST,設置請求體(Data)
d.發送一個異步請求
e.補充:設置請求超時,處理錯誤信息,設置請求頭(如獲取客戶端的版本等等,請求頭是可設置可不設置的)

(2)相關代碼線程

//1.肯定請求路徑
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"];

    //2.建立請求對象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    //2.1更改請求方法
    request.HTTPMethod = @"POST";

    //2.2設置請求體
    request.HTTPBody = [@"username=520it&pwd=520it" dataUsingEncoding:NSUTF8StringEncoding];

    //2.3請求超時
    request.timeoutInterval = 5;

    //2.4設置請求頭
    [request setValue:@"ios 9.0" forHTTPHeaderField:@"User-Agent"];


    //3.發送請求
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * __nullable response, NSData * __nullable data, NSError * __nullable connectionError) {

        //4.解析服務器返回的數據
        if (connectionError) {
            NSLog(@"--請求失敗-");
        }else
        {
            NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
        }

    }];

  NSURLConnection和RunLoop之間的關係(使用代理方法發送GET異步請求)

1.使用主線程發送:

  代理方法一:

  代理方法二:

1.使用子線程發送:(考慮到下載耗時)

  代理方法一:

  代理方法二:

注意點:代理方法一和方法二之間的區別就是代理方法是否立刻發送請求.

  1)若沒有設置,則默認的是立刻發送請求,可是問題來了,子線程並不會開啓?

   解決方案:手動開啓子線程的RunLoop

    [[NSRunLoop currentRunLoop] run];

  2)如有設置,且設置爲NO,那麼咱們就得手動去發送請求:

    [connect start];  

    //該方法內部會自動將當前的請求對象添加到runloop中,指定運行模式爲默認
         //若是子線程對應的runloop沒有建立,那麼會自動建立      

相關文章
相關標籤/搜索