今天開始打算總結一下在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....關于這個作者突然失蹤的框架,雖然很好用,但是真的沒必要再用了
新聞熱點
疑難解答