//同步下載,同步請求的主要代碼如下
- (IBAction)downLoad:(id)sender {
? ? NSString *urlAsString=@"http://7jpnsh.com1.z0.glb.clouddn.com/TravelDemo.plist";//文件地址
? ? NSURL *url=[NSURL URLWithString:urlAsString];
? ? NSURLRequest *request=[NSURLRequest requestWithURL:url];
? ? NSMutableData *error=nil;
? ? NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
?? ?
? ? //文件保存目錄
? ? NSString *cachePath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
? ? NSLog(@"%@",cachePath);
? ? NSString *filename=[cachePath stringByAppendingPathComponent:@"TravelDemo.plist"];
? ? /*下載的數據*/
? ? if (data!=nil) {
? ? ? ? NSLog(@"下載成功");
? ? ? ? if ([data writeToFile:filename atomically:YES]) {
? ? ? ? ? ? NSLog(@"保存成功");
? ? ? ? }else
? ? ? ? {
? ? ? ? ? ? NSLog(@"保存失敗");
? ? ? ? }
? ? }else{
? ? ? ? NSLog(@"%@",error);
? ? }
}
?
//異步下載,異步請求的代碼如下
- (IBAction)downLoad:(id)sender {
?? NSString *urlAsString=@"http://7jpnsh.com1.z0.glb.clouddn.com/TravelDemo.plist";
? ? NSURL *url=[NSURL URLWithString:urlAsString];
? ? NSURLRequest *request=[NSURLRequest requestWithURL:url];
? ? NSMutableData*data=[[NSMutableData alloc]init];
?? ?
? ? self.connectionData=data;
//? ? [data release];
? ? NSURLConnection *newConnection=[[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:YES];
/**
? ? connection 和conectionData 類型如下:
? ? ?NSURLConnection *connection;
? ? ?NSMutableData *connectionData;
**/
? ? self.connection=newConnection;
? ? if (self.connection!=nil) {
? ? ? ? NSLog(@"成功創建連接");
? ? }else{
? ? ? ? NSLog(@"創建連接失敗");
? ? }??
}
//異步下載代理方法
-(void)connection:(NSURLConnection*)connection didFailWithError:(NSError *)error{
? ? NSLog(@"出錯");
? ? NSLog(@"%@",error);
}
-(void)connection:(NSURLConnection*)connection didReceiveData:(NSData *)data{
? ? NSLog(@"Received data");
? ? [self.connectionData appendData:data];
}
-(void)connectionDidFinishLoading:(NSURLConnection*)connection{
? ? NSLog(@"下載成功");
? ? ? ? //文件保存目錄
? ? ? ? NSString *cachePath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
? ? ? ? NSLog(@"%@",cachePath);
?? ? ? NSString *filename=[cachePath stringByAppendingPathComponent:@"TravelDemo.plist"];
? ? if ([self.connectionData writeToFile:filename atomically:YES]) {
? ? ? ? NSLog(@"保存成功");
? ? }else{
? ? ? ? NSLog(@"保存失敗");
? ? }
}
補充:
connectionWithRequest需要delegate參數,通過一個delegate來做數據的下載以及Request的接受以及連接狀態,此處delegate:self,所以需要本類實現一些方法,并且定義mData做數據的接受。
需要實現的方法:
1、獲取返回狀態、包頭信息。
-?(void)connection:(NSURLConnection?*)connection?didReceiveResponse:(NSURLResponse?*)response;
2、連接失敗,包含失敗。
-?(void)connection:(NSURLConnection?*)connection?didFailWithError:(NSError?*)error;
3、接收數據
-?(void)connection:(NSURLConnection?*)connection?didReceiveData:(NSData?*)data;
4、數據接收完畢
- (void)connectionDidFinishLoading:(NSURLConnection?*)connection;
? 同步請求數據會造成主線程阻塞,通常在請求大數據或網絡不暢時不建議使用。
? ? ? ? 從上面的代碼可以看出,不管同步請求還是異步請求,建立通信的步驟基本是一樣的:
? ? ? ? ?1、創建NSURL
? ? ? ? ?2、創建Request對象
? ? ? ? ?3、創建NSURLConnection連接。
? ? ? ? ?NSURLConnection創建成功后,就創建了一個http連接。異步請求和同步請求的區別是:創建了異步請求,用戶可以做其他的操作,請求會在另一個線程執行,通信結果及過程會在回調函數中執行。同步請求則不同,需要請求結束用戶才能做其他的操作。
?