首页 运维 网络学院 查看内容

IOS中的网络编程

2016-1-27 11:48 1966 0

摘要: 在移动互联网时代,几乎所有应用都需要用到网络下载,比如图片的加载,音乐的下载,安装包的下载,等等,下面我们来看看如何进行下载一、文件的下载我们用get来请求数据,并对请求的二进制数据进行解析存入文件,首 ...
关键词: self 文件 句柄 数据 进度 nonatomic property NSURLConnection handle currentLength

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

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

- (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];
}
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花
1

鸡蛋

刚表态过的朋友 (1 人)

  • 鸡蛋

    匿名

最新评论

返回顶部