今天開始打算總結一下在iOS開發中的網路部分
NSURLConnection 這個訪問網路的方式最簡單,但功能也是最少的因此只有很簡單的網路訪問才會用到;
使用NSURLConnection訪問網路大致分為四個步驟
下面我們開始前三步吧
NSString *urlString=@"http://m.baidu.com";// 如果URL中含有中文的話要用下面這一句轉換成帶百分比符號的unicode才可以// urlString=[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url=[NSURL URLWithString:urlString];// 其實也有只傳入url就可以建立一個,但是最好還是加上緩衝策略,以及逾時時間比較好一點 NSURLRequest *request=[NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:2.0];// 這裡的代理就用控制器好了不過要遵守<NSURLConnectionDataDelegate>協議來處理收到的資料 NSURLConnection *connection=[[NSURLConnection alloc]initWithRequest:request delegate:self];//啟動串連,串連可以在上一行調用另一個方法可以在建立完畢時啟動,就是用再多一個參數的構造方法就可以,不過最好還是手動啟動 [connection start];
NSURLConnection的類方法也有可以直接在產生對象之後直接啟動的,但是最好還是手動啟動比較好
上面幾行代碼就是準備工作了,接下來我們開始編寫代理方法
#pragma mark 開始發送請求-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ _data=[NSMutableData data];}
這個方法在串連收到伺服器的響應的時候調用,用於完成資料接收的準備工作.
我在類擴充裡聲明了一個成員變數_data用於儲存返回的資料在這裡執行個體化一下也可以在下一個方法裡面懶載入
接下來就是接收資料了
#pragma mark 收到了返回資料-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{//這個應該算是懶載入,這裡寫了其實上面的方法裡面就不需要寫了 if (nil==_data) { _data=[NSMutableData data]; } [_data appendData:data];}
值得注意的是這個方法是會反覆調用的,不論是請求多小的資料都有可能會反覆調用,所以需要一個可變的_data成員變數來拼接一下資料
接下來是完成載入
#pragma mark 載入資料完成- (void)connectionDidFinishLoading:(NSURLConnection *)connection{ NSString *str=[[NSString alloc]initWithData:_data encoding:NSUTF8StringEncoding]; //baseurl基礎URL用於網站資源的訪問,這裡寫的就過於簡單了,其實baseurl應該動態擷取的 [_webView loadHTMLString:str baseURL:[NSURL URLWithString:@"http://m.baidu.com"]]; _data=nil;}
當資料轉送完成的時候會調用這個方法,用來處理一下接收到的資料吧,我這裡因為以訪問百度頁面為例所以返回的就是一個html的資料,把它轉成字串,然後用一個webView載入一下就可以顯示出來了,這裡也可以用來下載資料
接下來是錯誤處理頁面了
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ NSLog(@"%@",error.localizedDescription);}
我這裡只是輸出了一下錯誤,也可以在這裡重新啟動一下串連
其實在實際開發中NSURLConnection只適合處理一些簡單的網路連接工作,當處理一些複雜的協議的時候就比較蛋疼了,一般都在用asi和afn架構,同時令人振奮的是蘋果在ios7推出了NSURLSession,好吧 我只能說現在iOS所有網路訪問第三方架構基本都可以退休了,我會在最新動向幾篇關於各個網路訪問架構的文章,關於afn和NSURLSession的.至於asi....關於這個作者突然失蹤的架構,雖然很好用,但是真的沒必要再用了