iOS 網路請求接收資料流程 (NSURLRequest&NSURLConnection)

來源:互聯網
上載者:User

網路編程中一般都是經過  請求---》串連---》響應   (request  --》  connection  --》  response)這個過程。

一般的步驟是這樣的:

1、先建立一個NSURL。

2、通過這個指定的URL建立NSURLRequest,這裡還可以指定緩衝策略和逾時時間。

3、根據你的request建立NSURLConnection,並對你的connection進行響應(同步、非同步)。

下面詳細解說這個過程

1、建立URL

    NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];

2、建立NSURLRequest

NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];

解釋一下其中的初始化參數:initWithURL:這裡指定要訪問的url;cachePolicy:這裡是指定緩衝策略(包括6種);timeoutInterval:指定逾時時間

緩衝策略:

NSURLRequestCachePolicyThese constants are used to specify interaction with the cached responses.enum{   NSURLRequestUseProtocolCachePolicy = 0,   NSURLRequestReloadIgnoringLocalCacheData = 1,   NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4,   NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,   NSURLRequestReturnCacheDataElseLoad = 2,   NSURLRequestReturnCacheDataDontLoad = 3,   NSURLRequestReloadRevalidatingCacheData = 5};typedef NSUInteger NSURLRequestCachePolicy;

稍微解釋一下:

 NSURLRequestUseProtocolCachePolicy(基礎策略)這個是NSURLRequest的預設策略

 NSURLRequestReloadIgnoringLocalCacheData(忽略本機快取)

 NSURLRequestReturnCacheDataElseLoad(首先使用緩衝,如果沒有本機快取,才從原地址下載)

 NSURLRequestReturnCacheDataDontLoad(使用本機快取,從不下載,如果本地沒有緩衝,則請求失敗,此策略多用於離線操作)

 NSURLRequestReloadIgnoringLocalAndRemoteCacheData(無視任何緩衝策略,無論是本地的還是遠端,總是從原地址重新下載)

 NSURLRequestReloadRevalidatingCacheData(如果本機快取是有效則不下載,其他任何情況都從原地址重新下載)

具體的請參看這一篇部落格:http://blog.csdn.net/zeng11088/article/details/8544759(

NSURLRequest的官方文檔的譯文

3、建立NSURLConnection &  響應

首先,上面講到網路編程有同步和非同步兩種串連方式,串連採用同步響應是通過使用sendSynchronousRequest方法實現的,而串連採用非同步響應是通過代理NSURLConnectionDelegate的方法實現的
(1)同步串連響應:使用這個方法。

+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request  returningResponse:(NSURLResponse **)response  error:(NSError **)error

例如:

NSData *received = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];


(2)非同步串連響應:代理實現

建立一個connection之後調用以下相關的代理方法

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

①Sent when the connection has received sufficient data to construct the URL response for its request.

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

②Sent as a connection loads data incrementally.

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

③Sent when a connection has finished loading successfully

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

④Sent when a connection fails to load its request successfully.

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

稍微解釋一下這個過程:如果connection收到response,就調用delegate中的第①個方法didReceiveResponse方法,這裡需要建立一個data緩衝區,這個是第一步。然後一點點接收資料,不斷追加到先前建立的data,這個過程會重複調用didReceiveData方法,這個是第二步。如果接受完成,會調用connectionDidFinishLoading這個方法,表示資料全部接收完畢;如果接收資料出現錯誤或者異常,則會調用didFailWithError這個方法結束,這是第三步。

附:如果網路請求進行了一半時退出程式,大家都知道這時候程式會被掛起,那麼網路連接怎麼辦呢?實際上當程式退出時,系統並不會立即掛起應用進程,而是會延遲大概一秒,如果這樣請求還是沒有完成,系統底層會默默地幫你把資料都接收完,幫你儲存請求逾時時間那麼久。比如你設定逾時時間30s,30s內重新開啟應用,資料就立刻全都一次性收到,如果沒開啟,不好意思,下次開啟程式時,delegate的didFailWithError方法會被調用,通知你請求逾時了。


實際例子展示參考下一篇博文。


相關文章

聯繫我們

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