转载

IOS中的网络编程

在移动互联网时代,几乎所有应用都需要用到网络下载,比如图片的加载,音乐的下载,安装包的下载,等等,下面我们来看看如何进行下载

IOS中的网络编程

一、文件的下载我们用get来请求数据,并对请求的二进制数据进行解析存入文件,首先我们先引入一个第三方进度条 ,并且进行初始化

IOS中的网络编程

 - (void)viewDidLoad {     [super viewDidLoad];          //设置背景色     self.view.backgroundColor=[UIColor greenColor];          //引入第三方进度条     self.da=[[DACircularProgressView alloc] initWithFrame:CGRectMake(375/2.0-50, 30, 100, 100)];     [self.view addSubview:self.da];   } 

二、设置文件下载地址,开始下载数据

 #pragma mark - 开始下载数据 - (void) start{         //设置网络资源地址         NSString * str=@"http://dl.g.youku.com/20151023/1445588041_20151023XXXX.apk";         NSURL * url=[NSURL URLWithString:str];         NSMutableURLRequest * request=[NSMutableURLRequest requestWithURL:url];             // 设置Range,代表请求的开始位置,刚开始的默认位置为0         [request setValue:[NSString stringWithFormat:@"bytes=%ld-",self.currentLength] forHTTPHeaderField:@"Range"];       //发送请求       self.conn= [NSURLConnection connectionWithRequest:request delegate:self];  } 

三、实现代理方法

在下载的时候我们通常采用可变的NSMutableData来存下载的数据,但是用这种方式会导致内存越来越大,本来手机的内存都是有限的,因此我们需要对其进行优化,防止闪退,解决方式是我们不采用将请求的数据缓存带内存中,而是采取及时下载及时缓存的方式,每次下载都写入文件,代码如下

 @interface ViewController ()<NSURLConnectionDataDelegate>   /** 当前下载长度*/ @property(nonatomic,assign) NSInteger currentLength;  /** 文件总长度*/ @property(nonatomic,assign) NSInteger totalLength;  /** 链接长度*/ @property(nonatomic,strong) NSURLConnection * conn;  /** 文件写入句柄*/ @property(nonatomic,strong) NSFileHandle * handle;  /** 第三方进度条*/ @property(nonatomic,strong) DACircularProgressView * da; /** 第三方进度条*/ @property(nonatomic,weak) DPMeterView * dp; @end  #pragma mark - 响应代理方法,在沙盒创建文件和文件句柄 - (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{          if (self.totalLength<=0) {          self.totalLength=response.expectedContentLength;     }      //创建文件操作句柄     if (self.handle==nil) {           //获取文件路径         NSString *path=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];         path=[path stringByAppendingPathComponent:@"jereh.apk"];                  //创建管理类         NSFileManager * manager=[NSFileManager defaultManager];         [manager createFileAtPath:path contents:nil attributes:nil];                  //初始化管理句柄         self.handle=[NSFileHandle fileHandleForWritingAtPath:path];     }       }  #pragma mark - 接受数据代理方法,将接受到的数据写入文件,并且计算下载进度 - (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{       //记录当前长度,算取百分比     self.currentLength+=data.length;     CGFloat percent=self.currentLength*1.0/self.totalLength;          //移动到文件末尾     [self.handle seekToEndOfFile];         //将当前数据写入文件     [self.handle writeData:data];          //修改进度条     self.da.progress=percent;   } 

四、在文件下载时候我们需要暂停功能,如何让一个下载中的请求暂停呢?我们只需要调用取消方法即可

 #pragma mark - 设置暂停方法 - (void) pause{     [self.conn cancel];     self.conn=nil; } 

五、最后关闭句柄

 #pragma mark - 关闭句柄 -(void)dealloc{      [self.handle closeFile]; } 

作者:杰瑞教育

出处: http://www.cnblogs.com/jerehedu/

版权声明:本文版权归 杰瑞教育

技有限公司 和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

技术咨询: IOS中的网络编程

原文  http://www.cnblogs.com/jerehedu/p/5162168.html
正文到此结束
Loading...