網路編程中一般都是經過 請求---》串連---》響應 (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方法會被調用,通知你請求逾時了。
實際例子展示參考下一篇博文。