原文摘自: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];
}