IPhone 網絡開發之如何使用NSURLConnection(一)


原文摘自:http://hi.baidu.com/jt_one/blog/item/2c34800264c8ff134afb5123.html



NSURLConnection 提供了很多靈活的方法下載URL內容 
也提供了一個簡單的接口去創建和放棄連接,同時使用很多的delegate 
方法去支持連接過程的反饋和控制 

如何創建一個連接呢? 

為了下載url的內容,程序需要提供一個delegate對象,並且至少實現下面的方法 
connection:didReceiveResponse:,conncetion:didReceiveData, 
conncetion:didFailWithError:和connectionDidFinishLoading: 

舉例一: 
1、先創建一個NSURL 
2、在通過NSURL創建NSURLRequest,可以指定緩存規則和超時時間 
3、創建NSURLConnection實例,指定NSURLRequest和一個delegate對象 
   如果創建失敗,則會返回nil,如果創建成功則創建一個NSMutalbeData的實例用來存儲數據 

代碼: 
NSURLRequest *theRequest=[NSURLRequest requestWithURL: 
                  [NSURL URLWithString:@“http://www.sina.com.cn/”] 
                 cachePolicy:NSURLRequestUseProtocolCachePolicy 
                 timeoutInterval:60.0]; 
NSURLConnection *theConncetion=[[NSURLConnection alloc]      
                   initWithRequest:theRequest delegate:self]; 
if(theConnection) 
{ 
//創建NSMutableData 
  receivedData=[[NSMutableData data] retain]; 
}else 創建失敗 

NSURLConnection還有幾個初始化函數,有個初始化函數可以做到創建連接但是並 
不馬上開始下載,而是通過start:開始 

當收到initWithRequest: delegate: 消息時,下載會立即開始,在代理(delegate) 
收到connectionDidFinishLoading:或者connection:didFailWithError:消息之前 
可以通過給連接發送一個cancel:消息來中斷下載 

當服務器提供了足夠客戶程序創建NSURLResponse對象的信息時,代理對象會收到 
一個connection:didReceiveResponse:消息,在消息內可以檢查NSURLResponse 
對象和確定數據的預期長途,mime類型,文件名以及其他服務器提供的元信息 

要注意,一個簡單的連接也可能會收到多個connection:didReceiveResponse:消息 
當服務器連接重置或者一些罕見的原因(比如多組mime文檔),代理都會收到該消息 
這時候應該重置進度指示,丟棄之前接收的數據 

-(void)connection:(NSURLConnection *)connectiondidReceiveResponse: 
                        (NSURLResponse*)response 
{ 

   [receiveData setLength:0]; 

} 

當下載開始的時候,每當有數據接收,代理會定期收到connection:didReceiveData:消息 
代理應當在實現中儲存新接收的數據,下面的例子既是如此 

-(void) connection:(NSURLConnection*)connection didReceiveData: 
            (NSData *) data 
{ 
   [receiveData appendData:data]; 

} 
在上面的方法實現中,可以加入一個進度指示器,提示用戶下載進度 

當下載的過程中有錯誤發生的時候,代理會收到一個connection:didFailWithError消息 
消息參數里面的NSError對象提供了具體的錯誤細節,它也能提供在用戶信息字典里面失敗的 
url請求(使用NSErrorFailingURLStringKey) 

當代理接收到連接的connection:didFailWithError消息后,對於該連接不會在收到任何消息 

舉例 
-(void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error 
{ 
[connection release]; 

  [receivedData release]; 
   NSLog(@"Connection failed! Error - %@ %@", 
          [error localizedDescription], 
          [[error userInfo] objectForKey:NSErrorFailingURLStringErrorKey]); 
} 

最后,如果連接請求成功的下載,代理會接收connectionDidFinishLoading:消息 
代理不會收到其他的消息了,在消息的實現中,應該釋放掉連接 

舉例: 
-(oid)connectionDidFinishLoading:(NSURLConnection*)connection 
{ 
   //do something with the data 
  NSLog(@“succeeded  %d byte received”,[receivedData length]); 

[connection release]; 
[receivedData release]; 

} 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM