iOS開發網絡篇—NSURLConnection基本使用

1、NSURLConnection的經常使用類json

(1)NSURL:請求地址數組

(2)NSURLRequest:封裝一個請求,保存發給服務器的所有數據,包括一個NSURL對象,請求方法、請求頭、請求體....服務器

(3)NSMutableURLRequest:NSURLRequest的子類網絡

(4)NSURLConnection:負責發送請求,創建客戶端和服務器的鏈接。發送NSURLRequest的數據給服務器,並收集來自服務器的響應數據app

 

2、NSURLConnection的使用異步

1.簡單說明url

使用NSURLConnection發送請求的步驟很簡單spa

(1)建立一個NSURL對象,設置請求路徑(設置請求路徑)線程

(2)傳入NSURL建立一個NSURLRequest對象,設置請求頭和請求體(建立請求對象)3d

(3)使用NSURLConnection發送NSURLRequest(發送請求)

2.代碼示例

(1)發送請求的三個步驟:

    1.設置請求路徑

    2.建立請求對象

    3.發送請求

        3.1發送同步請求(一直在等待服務器返回數據,這行代碼會卡住,若是服務器,沒有返回數據,那麼在主線程UI會卡住不能繼續執行操做)有返回值

        3.2發送異步請求:沒有返回值

說明:任何NSURLRequest默認都是get請求。

 

(2)發送同步請求代碼示例:

#pragma mark- NSURLConnection同步發送請求


- (void)sendRequestSync

{

    //請求的地址

    NSURL *url = [[NSURL alloc] initWithString:@"http://aqicn.org/publishingdata/json"];

    //建立請求

    NSURLRequest *req = [[NSURLRequest alloc] initWithURL:url];

    // 發送同步請求, data就是返回的數據

    NSData *data = [NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil];

    if (data == nil) {

        NSLog(@"send request failed!");

    }

    

    NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];

    

    NSDictionary *dic = [arr objectAtIndex:0];

    NSArray *arrNew = [dic objectForKey:@"pollutants"];

    NSDictionary *dicNew = [arrNew objectAtIndex:0];

    msgLable.text = [NSString stringWithFormat:@"污染源:%@,污染指數:%@",[dicNew objectForKey:@"pol"],[dicNew objectForKey:@"value"]];

}


(3)發送異步請求

發送異步請求有兩種方式:

1)使用block回調

2)代理

A.使用block回調方法發送異步請求

使用block回調代碼示例

#pragma mark- NSURLConnection異步發送請求block方式


-(void) sendRequestAsyByBlock

{

    //請求的地址

    NSURL *url = [[NSURL alloc] initWithString:@"http://aqicn.org/publishingdata/json"];

    //建立請求

    NSURLRequest *req = [[NSURLRequest alloc] initWithURL:url];

    

    //建立一個隊列(默認添加到該隊列中的任務異步執行)

    //NSOperationQueue *queue=[[NSOperationQueue alloc]init];

    

    //獲取一個主隊列

    NSOperationQueue *queue=[NSOperationQueue mainQueue];

    [NSURLConnection sendAsynchronousRequest:req queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError)

    {

        NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];

        

        NSDictionary *dic = [arr objectAtIndex:0];

        NSArray *arrNew = [dic objectForKey:@"pollutants"];

        NSDictionary *dicNew = [arrNew objectAtIndex:0];

        msgLable.text = [NSString stringWithFormat:@"污染源:%@,污染指數:%@",[dicNew objectForKey:@"pol"],[dicNew objectForKey:@"value"]];

    }];


}

代碼說明:

block代碼段:當服務器有返回數據的時候調用會開一條新的線程去發送請求,主線程繼續往下走,當拿到服務器的返回數據的數據的時候再回調block,執行block代碼段。這種狀況不會卡住主線程。

隊列的做用:決定這個block操做放在哪一個線程執行?

刷新UI界面的操做應該放在主線程執行,不能放在子線程,在子線程處理UI相關操做會出現一些莫名的問題。

小提示

(1)建立一個操做,放在NSOperation隊列中執行,默認是異步執行的。

(2)mainqueue   返回一個和主線程相關的隊列,即主隊列。

B.使用代理方法發送異步請求

要監聽服務器返回的data,因此使用<NSURLConnectionDataDelegate>協議

常見大代理方法以下:

#pragma mark- NSURLConnectionDataDelegate代理方法(異步請求)


//當接收到服務器的響應(連通了服務器)時會調用


-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{

    NSLog(@"接收到服務器的響應");

    //初始化數據

    self.responseData=[NSMutableData data];

}

//當接收到服務器的數據時會調用(可能會被調用屢次,每次只傳遞部分數據)

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{

    NSLog(@"接收到服務器的數據");

    //拼接數據

    [self.responseData appendData:data];

}

//當服務器的數據加載完畢時就會調用

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{

    

//    NSString *results = [[NSString alloc]

//                         initWithBytes:[responseData bytes]

//                         length:[responseData length]

//                         encoding:NSUTF8StringEncoding];

//    

//    NSLog(@"connectionDidFinishLoading: %@",results);


    //數據返回的是json數組 這裏直接把json數組轉成OC數組

    NSArray *arr = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableLeaves error:nil];


    NSDictionary *dic = [arr objectAtIndex:0];

    NSArray *arrNew = [dic objectForKey:@"pollutants"];

    NSDictionary *dicNew = [arrNew objectAtIndex:0];

    msgLable.text = [NSString stringWithFormat:@"污染源:%@,污染指數:%@",[dicNew objectForKey:@"pol"],[dicNew objectForKey:@"value"]];

    

   

}

//請求錯誤(失敗)的時候調用(請求超時\斷網\沒有網\,通常指客戶端錯誤)

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

{

     NSLog(@"Connection failed: %@", error);

}



//異步請求加載數據

-(void)loadDataAsy{

    msgLable.text = @"數據加載中....";

    //請求的地址

    NSURL *url = [[NSURL alloc] initWithString:@"http://aqicn.org/publishingdata/json"];

    //建立請求

    //NSURLRequest *req = [[NSURLRequest alloc] initWithURL:url];

    //設置請求超時

    NSMutableURLRequest *req=[NSMutableURLRequest  requestWithURL:url];

    req.timeoutInterval=5.0;

    //建立鏈接

    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:req delegate:self];

    [connection start];

}

補充

(1)數據的處理

在didReceiveData:方法中,拼接接收到的全部數據,等全部數據都拿到後,在connectionDidFinishLoading:方法中進行處理

(2)網絡延遲

在作網絡開發的時候,必定要考慮到網絡延遲狀況的處理。

最終的顯示效果:

相關文章
相關標籤/搜索