NSURLConnection學習筆記,nsurlconnection
雖說現在都用三方庫來擷取網路資料,再不濟也會用蘋果官方的NSURLSession,但有些東西還是要先學會才有資格說不好不用,不是嗎?
NSURLConnection發送請求是分為同步和非同步兩種方式的,同步顧名思義就是在發送請求的同時就要立刻處理,在主線程中會阻塞其他動作,如果網路請求比較耗時的話,就會影響使用者體驗。同步方法如下:
1 + (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error;
這是一個傳回值為NSURLConnection的類方法。為什麼同步有傳回值非同步沒有呢,這個稍後再說。
非同步請求就不會阻塞主線程的其他動作了,根據伺服器返回資料處理方式的不同又可以分為兩種:
block回調
1 + (void)sendAsynchronousRequest:(NSURLRequest*) request queue:(NSOperationQueue*) queue completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler;
代理
1 - (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate;2 3 - (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:(BOOL)startImmediately;
兩個對象方法,後一個可以控制是否立即請求,傳NO的話可以在之後需要請求的時候調用start方法開始請求。
還有一個類方法:
+ (NSURLConnection *)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate;
成為NSURLConnection的代理,需要遵守NSURLConnectionDataDelegate協議,而不是NSURLConnectionDelegate協議。
代理方法如下:
開始接收到伺服器的響應時調用- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;接收到伺服器返回的資料時調用(伺服器返回的資料比較大時會調用多次)- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;伺服器返回的資料完全接收完畢後調用- (void)connectionDidFinishLoading:(NSURLConnection *)connection;請求出錯時調用(比如請求逾時)- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
下面來看一下不同的請求方式
GET:使用GET請求資料,參數要拼接在url中,所以使用者資訊等比較敏感的內容不要用GET方式。
POST:使用POST請求資料,參數要放在請求體中,上傳操作要使用POST方式。
使用POST方式時要使用可變請求NSMutableRequest
佈建要求逾時等待時間(超過這個時間就算逾時,請求失敗)- (void)setTimeoutInterval:(NSTimeInterval)seconds;佈建要求方法(比如GET和POST)- (void)setHTTPMethod:(NSString *)method;佈建要求體- (void)setHTTPBody:(NSData *)data;佈建要求頭- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
最後要注意的是,請求體(也就是參數)中如果有中文時,需要使用utf-8進行編碼
// GETNSString *urlStr = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];// POSTrequest.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
至於非同步函數為什麼沒有傳回值的問題,原因是非同步函數進行網路請求的時間不確定,所以要等到資料返回後才能開始進一步的操作,如果直接使用對象接收傳回值的話,可能造成空值,所以使用block或者代理對返回的資料進行操作。