• IOS中的网络编程


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

    一、文件的下载我们用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];
    }
    作者:杰瑞教育
    出处:http://www.cnblogs.com/jerehedu/ 
    版权声明:本文版权归杰瑞教育技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    技术咨询:JRedu技术交流
     
  • 相关阅读:
    dubbo系列五、dubbo核心配置
    dubbo系列四、dubbo服务暴露过程源码解析
    dubbo系列三、架构介绍及各模块关系
    dubbo系列二、dubbo+zookeeper+dubboadmin分布式服务框架搭建(windows平台)
    dubbo系列一、dubbo背景介绍、微服务拆分
    Python "HTTP Error 403: Forbidden"
    UnicodeEncodeError: ‘gbk’ codec can’t encode character u’u200e’ in position 43: illegal multib
    pycharm 激活
    Win7 在安装vs2010后向sql2008添加SQL_Server_Management详解
    vs2010,vs2012如何连接vss2005,vss2008
  • 原文地址:https://www.cnblogs.com/jerehedu/p/5162168.html
Copyright © 2020-2023  润新知