iOS 中用戶端和伺服器的 Web Service 網路通訊 (2)
在實際的應用開發過程中,同步請求的使用者體驗並不是很好;我們都知道,Apple是很重視使用者體驗的,這一點也成為了行業的標杆,沒有使用者哪裡來的好產品,所以使用者體驗是極其重要的。貌似廢話有點多,接下來進入正題。同步請求不好,那麼就使用非同步請求的方法。在開發中,非同步請求會使用 NSURLConnetction 類的委託協議 NSURLConnectionDelegate。在請求不同階段會回調委派物件方法,具體方法如下:
connection:didReceiveData: 當請求成功時,這個方法就會開始接收資料,如果資料量很多,它會被多次調用; connection:didFailWithError: 從方法中我們也可以大體知道這個方法的作用,沒錯,就是用來處理當載入資料出現異常的時候調用的; connectionDidFinishLoading: 從方法的命名中也可以知道這個方法是用來當成功完成載入資料時調用的,但在 connection:didReceiveData: 方法之後執行。
PS:記得在.h標頭檔中的 @interface 介面中加入委託的申明 哦!
加下來是具體實現的代碼:
* 開始請求Web Service */-(void)startRequest{ NSString *strURL = [[NSString alloc] initWithFormat: @"請求伺服器位址"]; NSURL *url = [NSURL URLWithString:[strURL URLEncodedString]]; NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; if (connection) { self.datas = [NSMutableData new]; } }#pragma mark- NSURLConnection method- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [self.datas appendData:data]; //利用NSMutalbeArray數組datas不斷接收伺服器端返回的資料}-(void) connection:(NSURLConnection *)connection didFailWithError: (NSError *)error { NSLog(@"%@",[error localizedDescription]);}//當connection:didReceiveData:方法成功接收資料後回調這個方法- (void) connectionDidFinishLoading: (NSURLConnection*) connection { NSLog(@"請求完成..."); NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:_datas options:NSJSONReadingAllowFragments error:nil]; [self reloadView:dict]; //從服務端接收完整資料後,再把資料發送回展示層的視圖控制器}