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

 

posted @ 2015-08-27 10:25  王 彪  阅读(314)  评论(0编辑  收藏  举报