ios自带NSURLConnection下载文件
//同步下载,同步请求的主要代码如下
- (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连接。异步请求和同步请求的区别是:创建了异步请求,用户可以做其他的操作,请求会在另一个线程执行,通信结果及过程会在回调函数中执行。同步请求则不同,需要请求结束用户才能做其他的操作。