iOS網路: NSURLConnection進行非同步請求

來源:互聯網
上載者:User

標籤:style   blog   http   io   color   ar   os   使用   sp   

介紹:   iOS 的應用,一般是需要通過網路進行資料的互動的,這樣你的應用就成為了聯機的應用了。 

   iOS SDK 允許我們向網路發送請求,並且能夠很方便的通過 NSURLConnection 這個類 來擷取和發送資料,我們可以通過 NSJSONSerialization 對 JSON 進行序列化和還原序列化。 XML 的解析則使用 NSXMLParser 類。可以通過 Twitter 架構進行 Twitter 進行串連。 

 

一  通過NSURLConnection進行非同步下載

1.NSURLConnection 提供了兩種方式來實現串連,一種是同步的另一種是非同步,非同步 的串連將會建立一個新的線程,這個線程將會來負責下載的動作。而對於同步串連,在下載 串連和處理通訊時,則會阻塞當前調用線程。  許多開發人員都會認為同步的串連將會堵塞主線程,其實這種觀點是錯誤的。一個同步的串連是會阻塞調用它的線程。如果你在主線程中建立一個同步串連,沒錯,主線程會阻塞。 但是如果你並不是從主線程開啟的一個同步的串連,它將會類似非同步串連一樣。因此這種情況並不會堵塞你的主線程。事實上,同步和非同步主要區別就是運行 runtime 為會非同步串連建立一個線程,而同步串連則不會。  2.為了能夠建立一個非同步請求串連,我們需要做如下的操作。
1. 建立一個 NSSring 類型的 URL 連接字串。
2. 把 NSString 類型轉化成 NSURL 類型。
3. 把我們的URL對象賦值到 NSURLRequest 對象中,如果是多個串連請求,請使用 NSMutableURLRequest.4. 建立一個 NSURLConnection 的串連執行個體,然後把我們定義好的 URL 請求賦值過去。   我們可以通過 NSURLConnection 的 sendAsynchronousRequest:queue:completionHandler 這個方法建立一個非同步 URL 連線物件。這個方法的參數如下:  sendAsynchronousRequest    非同步請求 Queue     一個操作隊列,我們可以很輕鬆的分配和初始化一個操作隊列,然後可以根據我們需求添加到這個參數中。

completionHandler

  這是一個 block 對象,當我們非同步串連操作完成之後,無論我們的非同步作業是否成功,都會執行這個 block,這個 block 對象都能夠接收到如下三個參數:

    1).一個 NSURLResopne,這個對象封裝了伺服器返回給我們 response。

    2).NSData,可選的,這個是我們通過 URL 請求返回的資料。

    3).NSError 類型的對象,如果請求中有錯誤發生。 

 注意:

sendAsynchronousRequest:queue:completionHandler: 方法不會在主線程中調用。因此如果你想執行一個跟 UI 相關的任務,那麼請回到主線程中。 

 

例子:

- (void)sendAsynNetWork{    NSString *urlString = @"http://www.apple.com";    NSURL *url = [NSURL URLWithString:urlString];    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];    NSOperationQueue *queue = [[NSOperationQueue alloc]init];    //發送非同步請求    [NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {        if ([data length] > 0 && connectionError == nil) {            NSString *html = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];            NSLog(@"HTML = %@",html);            //儲存從網路上下載的資料到你的硬碟中            //1.擷取儲存路徑            NSString *documentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];            //將檔案名稱添加到儲存路徑上,形成檔案路徑            NSString *filePath = [documentsDir stringByAppendingPathComponent:@"apple.html"];            //將資料寫入檔案 存到硬碟            [data writeToFile:filePath atomically:YES];            NSLog(@"Successfully saved the file to %@",filePath);        }        else if ([data length] == 0 && connectionError == nil){            NSLog(@"Nothing was downloaded");        }        else if (connectionError != nil){            NSLog(@"connectionError happened = %@",connectionError);        }    }];}
在 iOS SDK 早期的版本中,URL 串連使用的是 delegation 模型,不過,現在全部都使用 block 了,你不用在考慮實現 delegate 方法。 

 

二. 處理非同步串連中的逾時

建立一個非同步請求的時候,你想設定一個響應逾時的值,來完善你的應用程式 

討論:

當初始化 NSURLRequest 這個對象,並且把這個對象傳遞給 URL 連線物件的時候,你可以使用 requestWithURL:cachePolicy:timeoutInterval:這個類方法,將逾時的值傳遞給 timeoutInterval 參數。 

這裡詳細看第二個參數 cachePolicy:  參數值在 NSURLRequestCachePolicy(緩衝策略) 枚舉中選擇:

typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy)

{

 

1> NSURLRequestUseProtocolCachePolicy = 0, 預設的緩衝策略, 如果緩衝不存在,直接從服務端擷取。如果緩衝存在,會根據response中的Cache-Control欄位判斷下一步操作,如: Cache-Control欄位為must-revalidata, 則詢問服務端該資料是否有更新,無更新的話直接返回給使用者快取資料,若已更新,則請求服務端. 2> NSURLRequestReloadIgnoringLocalCacheData = 1, 忽略本機快取資料,直接請求服務端. 3> NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, 忽略本機快取,Proxy 伺服器以及其他中介,直接請求源服務端. 4> NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData 5> NSURLRequestReturnCacheDataElseLoad = 2, 有緩衝就使用,不管其有效性(即忽略Cache-Control欄位), 無則請求服務端. 6> NSURLRequestReturnCacheDataDontLoad = 3, 死活載入本機快取. 沒有就失敗. (確定當前無網路時使用) 7> NSURLRequestReloadRevalidatingCacheData = 5, 快取資料必須得得到服務端確認有效才使用(貌似是NSURLRequestUseProtocolCachePolicy中的一種情況) };Tips: URL Loading System預設只支援如下5中協議: 其中只有http://和https://才有緩衝策略.(1) http://(2) https://(3) ftp://(4) file://(5) data://

 

 //設定更詳細的request  第二個參數緩衝策略 第三個參數最大等待時間    NSURLRequest *urlrequest1 = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:15.0f];

 

    

iOS網路: NSURLConnection進行非同步請求

聯繫我們

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