1. 程式人生 > >iOS學習筆記(八)——iOS網路通訊http之NSURLConnection

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

      移動網際網路時代,網路通訊已是手機終端必不可少的功能。我們的應用中也必不可少的使用了網路通訊,增強客戶端與伺服器互動。這一篇提供了使用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 *[email protected]"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 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 張興業*  iOS入門群:83702688
*  android開發進階群:241395671*/參考: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

相關推薦

iOS學習筆記()——iOS網路通訊httpNSURLConnection

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

IOS開發學習筆記 圖片瀏覽器

首先是效果圖:demo下載 把圖片素材放入Assets.xcassets 建立plist檔案(本質是xml檔案) 介面的搭建,按照頁面佈局拖拽新增控制元件 ViewController具體程式碼

ios學習筆記---ios完整學習路線

size tle spa mage 技術分享 soft 分享 -s 學習筆記 ios完整學習路線 ios學習筆記---ios完整學習路線

iOS學習筆記(十七)——文件操作(NSFileManager)

技術分享 append hint pbo -cp fcm object 寫入 rtmp http://blog.csdn.net/xyz_lmn/article/details/8968213 iOS的沙盒機制,應用只能訪問自己應用目錄下的文件。ios不像Androi

iOS學習筆記23-音效與音樂

nslog ini post jpg outer 震動 ucc aml iboutlet 一、音頻 在iOS中,音頻播放從形式上能夠分為音效播放和音樂播放。 * 音效: * 主要指一些短音頻的播放,這類音頻一般不須要進行進度、循環等控制。 *

iOS學習筆記37-時間和日期計算

htm chinese 區域 nsis ios geo 代號 keyword 轉換 一、時間和日期計算 我們在應用開發中,時常須要和時間打交道,比方獲取當前時間,獲取兩個時間點相隔的時間等等,在iOS開發中與時間相關的類有例如以下幾個: 1. NSD

ios學習筆記:xcode手動匯入snapkit依賴庫

pod方式匯入失敗,所以手動匯入 大體上的框架是新建一個工程,然後將從github下載下來的snapkit develop資料夾下面的snapkit.xcoeproj拖到這個根目錄下面,因為這個檔案應該是有一個欄位,可以讓這個工程作為library 然後在需要的工程裡引入這個工程,點選工

IOS學習筆記】為UICollectionView設定自適應螢幕寬度以及點選效果

1、設定代理 @property (weak, nonatomic) IBOutlet UICollectionView *gridview; _gridview.dataSource=self; _gridview.delegate=self; 2、實現方法 筆者使用

IOS學習筆記】UITableView隱藏多餘分割線

-(void)setExtraCellLineHidden: (UITableView *)tableView { UIView *view = [UIView new]; view.backgroundColor = [UIColor clearColor]; [table

IOS學習筆記】UITableView 點選隱藏鍵盤 且不影響其他事件

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap)]; //加上這句不影響其他事件 tap.cancelsTouchesInView = NO

IOS學習筆記】UITableView點選後取消預設選擇背景色

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ //取消預設選中的效果 [_historyList deselectRowAtIndexPat

iOS學習筆記 -- Masonry的基本使用

最近在學習使用Masonry,在這裡簡單的做個分享。 Masonry主要有3個核心函式: // 構建約束 mas_makeConstraints // 更新約束 - 修改已經建立的約束,如果約束不存在,會在控制檯輸出錯誤 mas_updateConst

iOS學習筆記——滾動檢視(scrollView)

原始地址:http://blog.csdn.net/u012889435/article/details/17523705 滾動檢視:在根檢視中新增UIScrollViewDelegate協議,宣告一些物件屬性 @interface BoViewContro

iOS學習筆記-APP之間資料共享空間_APPGroup

appgroup用於兩個app之間共享檔案,開擴了一塊共同的儲存區域! 此外擴充套件( Extension )也需要使用appgroup的相關知識 此方法只能使用於同一個開發者賬號,如果不同開發者賬號請考慮剪下板 UIPasteboard 1.建立A

ios學習筆記-點選一個按鈕彈出撥打電話提示框

按鈕的程式碼就不寫了。直接寫主要程式碼。 <key>LSApplicationQueriesSchemes</key> <array> <string>tel</string> <string>telp

iOS學習筆記-如何獲取xib的autolayout後的frame

對於檢視view來說,如果想獲取xib中自動佈局後的frame,需要在layoutSubviews方法中獲取自動佈局後的frame才是準確的 - (void)layoutSubviews { [super layoutSubviews]; [self.

iOS學習筆記12--純程式碼實現原生UITabBarController,手勢滑動切換檢視

下面提供一個思路,具體程式碼最後提供例子。 1、新建一個類,繼承自UITabBarController。在專案例子中對應: TabBarViewController 2、建立多個子檢視,具體個數看需求而定。專案例子中對應: FirstViewContro

IOS學習筆記67-IOS8系列應用擴充套件

一、擴充套件概述 擴充套件(Extension)是iOS 8中引入的一個非常重要的新特性。擴充套件讓app之間的資料互動成為可能。使用者可以在app中使用其他應用提供的功能,而無需離開當前的應用。 在iOS 8系統之前,每一個app在物理上都是彼此獨立的,ap

iOS學習筆記6-關於NSNotificationCenter及同步非同步

iOS 提供了一種 “同步的” 訊息通知機制NSNotificationCenter,觀察者只要向訊息中心註冊, 即可接受其他物件傳送來的訊息,訊息傳送者和訊息接受者兩者可以互相一無所知,完全解耦。 基於這點,我們可以用來兩個物件之間的通訊! 注意,每個執行

iOS 學習筆記

單例模式: CocoaChina iOS設計模式:單例模式 什麼時候使用單例模式? 在程式中,單例模式經常用於只希望一個類只有一個例項,而不執行一個類還有兩個以上的例項。當然,在iOS SDK中,根據特定的需求,有些類不僅提供了單例訪問的介面,還為開發者提供了例項化一個新的物件介面