iOS學習筆記(八)——iOS網路通訊http之NSURLConnection

來源:互聯網
上載者:User

      移動互連網時代,網路通訊已是手機終端必不可少的功能。我們的應用中也必不可少的使用了網路通訊,增強用戶端與伺服器互動。這一篇提供了使用NSURLConnection實現http通訊的方式。

          NSURLConnection提供了非同步請求、同步請求兩種通訊方式。

1、非同步請求

       iOS5.0 SDK NSURLConnection類新增的sendAsynchronousRequest:queue:completionHandler:方法,從而使iOS5支援兩種非同步請求方式。我們先從新增類開始。

1)sendAsynchronousRequest

iOS5.0開始支援sendAsynchronousReques方法,方法使用如下:

- (void)httpAsynchronousRequest{    NSURL *url = [NSURL URLWithString:@"http://url"];        NSString *post=@"postData";        NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];    [request setHTTPMethod:@"POST"];    [request setHTTPBody:postData];    [request setTimeoutInterval:10.0];        NSOperationQueue *queue = [[NSOperationQueue alloc]init];    [NSURLConnection sendAsynchronousRequest:request                                       queue:queue                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){                               if (error) {                                   NSLog(@"Httperror:%@%d", error.localizedDescription,error.code);                               }else{                                                                      NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode];                                                                      NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];                                                                      NSLog(@"HttpResponseCode:%d", responseCode);                                   NSLog(@"HttpResponseBody %@",responseString);                               }                           }];    }

      sendAsynchronousReques可以很容易地使用NSURLRequest接收回調,完成http通訊。
2)connectionWithRequest

iOS2.0就開始支援connectionWithRequest方法,使用如下:

- (void)httpConnectionWithRequest{        NSString *URLPath = [NSString stringWithFormat:@"http://url"];    NSURL *URL = [NSURL URLWithString:URLPath];    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];    [NSURLConnection connectionWithRequest:request delegate:self];    }- (void)connection:(NSURLConnection *)theConnection didReceiveResponse:(NSURLResponse *)response{       NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode];    NSLog(@"response length=%lld  statecode%d", [response expectedContentLength],responseCode);}// A delegate method called by the NSURLConnection as data arrives.  The// response data for a POST is only for useful for debugging purposes,// so we just drop it on the floor.- (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)data{    if (mData == nil) {        mData = [[NSMutableData alloc] initWithData:data];    } else {        [mData appendData:data];    }    NSLog(@"response connection");}// A delegate method called by the NSURLConnection if the connection fails.// We shut down the connection and display the failure.  Production quality code// would either display or log the actual error.- (void)connection:(NSURLConnection *)theConnection didFailWithError:(NSError *)error{        NSLog(@"response error%@", [error localizedFailureReason]);}// A delegate method called by the NSURLConnection when the connection has been// done successfully.  We shut down the connection with a nil status, which// causes the image to be displayed.- (void)connectionDidFinishLoading:(NSURLConnection *)theConnection{    NSString *responseString = [[NSString alloc] initWithData:mData encoding:NSUTF8StringEncoding];     NSLog(@"response body%@", responseString);}

   connectionWithRequest需要delegate參數,通過一個delegate來做資料的下載以及Request的接受以及串連狀態,此處delegate:self,所以需要本類實現一些方法,並且定義mData做資料的接受。

需要實現的方法:


1、擷取返回狀態、包頭資訊。

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

2、串連失敗,包含失敗。

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


3、接收資料

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


4、資料接收完畢

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

    connectionWithRequest使用起來比較繁瑣,而iOS5.0之前用不支援sendAsynchronousRequest。有網友提出了AEURLConnection解決方案。

AEURLConnection is a simple reimplementation of the API for use on iOS 4. Used properly, it is also guaranteed to be safe against The Deallocation Problem, a thorny threading issue that affects most other networking libraries.

2、同步請求

同步請求資料方法如下:

- (void)httpSynchronousRequest{        NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]];    NSURLResponse * response = nil;    NSError * error = nil;    NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest                                          returningResponse:&response                                                      error:&error];        if (error == nil)    {        // 處理資料    }}

同步請求資料會造成主線程阻塞,通常在請求大資料或網路不暢時不建議使用。


        從上面的代碼可以看出,不管同步請求還是非同步請求,建立通訊的步驟基本是一樣的:

         1、建立NSURL

         2、建立Request對象

         3、建立NSURLConnection串連。

         NSURLConnection建立成功後,就建立了一個http串連。非同步請求和同步請求的區別是:建立了非同步請求,使用者可以做其他的操作,請求會在另一個線程執行,通訊結果及過程會在回呼函數中執行。同步請求則不同,需要請求結束使用者才能做其他的操作。

/**

* @author 張興業*  http://blog.csdn.net/xyz_lmn*  iOS入門群:83702688

*  android開發進階群:241395671

*  我的新浪微博:@張興業TBOW*/
參考:http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html#//apple_ref/doc/uid/20001836-BAJEAIEE
http://codewithchris.com/tutorial-how-to-use-ios-nsurlconnection-by-example/
http://kelp.phate.org/2011/06/ios-stringwithcontentsofurlnsurlconnect.html


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.