zoukankan      html  css  js  c++  java
  • iOS开发网络篇—使用ASI框架进行文件下载

    iOS开发网络篇—使用ASI框架进行文件下载

    说明:本文介绍iOS网络编程中经常用到的框架ASI,如何使用该框架进行文件的下载。

    一、简单介绍

    代码示例:

    #import "YYViewController.h"
    #import "ASIHTTPRequest.h"
    
    @interface YYViewController ()
    
    
    @end
    
    @implementation YYViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    }
    
    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        //下载服务器上的文件
        [self download];
    }
    
    #pragma mark-下载文件
    -(void)download
    {    //1.创建请求对象
        NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/resources/video.zip"];
        ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url];
        
        //2.添加请求参数(请求体中的参数)
        [request setDataReceivedBlock:^(NSData *data) {
            NSLog(@"%d",data.length);
        }];
        
        //3.异步发送网络请求
        [request startAsynchronous];
    }
    
    @end

    代码说明:上面的代码从服务器上异步下载文件,每当接收到数据的时候就打印接收到的数据的长度。

    打印结果如下:

    注意:在实际的开发中不能这样去下载文件,因为他不断的拼接文件数据的操作是在内存中进行的,如果所下载文件的数据较大,那么将会直接导致内存爆掉。

    二、实际开发中的使用

    代码示例(演示2):

    #import "YYViewController.h"
    #import "ASIHTTPRequest.h"
    
    @interface YYViewController ()
    
    
    @end
    
    @implementation YYViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    }
    
    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        //下载服务器上的文件
        [self download1];
    }
    
    #pragma mark-下载文件
    //演示1
    -(void)download
    {    //1.创建请求对象
        NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/resources/video.zip"];
        ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url];
        
        //2.添加请求参数(请求体中的参数)
        [request setDataReceivedBlock:^(NSData *data) {
            NSLog(@"%d",data.length);
        }];
        
        //3.异步发送网络请求
        [request startAsynchronous];
    }
    
    //演示2
    -(void)download1
    {
        //1.创建请求对象
        NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/resources/video.zip"];
        ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url];
        
        //2.设置下载文件保存的路径
        NSString *cachepath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
        NSString *filename=[cachepath stringByAppendingPathComponent:@"video.zip"];
        request.downloadDestinationPath=filename;
        NSLog(@"%@",filename);
        
        //3.发送网络请求(异步)
        [request startAsynchronous];
        
        //4.当下载完成后通知
        [request setCompletionBlock:^{
            NSLog(@"下载成功");
        }];
    }
    
    @end

    下载成功:

    代码说明:

    在实际的开发中如果要使用asi框架来下载服务器上的文件,只需要执行下面简单的几个步骤即可(参照上面的代码)。

    (1)创建请求对象;

    (2)设置下载文件保存的路径;

    (3)发送下载文件的网络请求(异步)。

    按照上面的几个步骤执行,程序会自动开启异步线程,一点一点的把数据写入到指定的文件路径,而且不论是下载多大的文件都不会占用大量的内存空间。

    asi框架是基于底层的cfnoteworking的,性能很好。当然也可以设置block,或者是监听下载的进度。

    下面介绍使用asi框架下载文件,如何监听下载的进度。

    设置下载代理,注意不是控制器代理。

    代码示例:

    #import "YYViewController.h"
    #import "ASIHTTPRequest.h"
    
    @interface YYViewController ()<ASIProgressDelegate>
    @property (weak, nonatomic) IBOutlet UIProgressView *progress;
    @end
    
    @implementation YYViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    }
    
    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        //下载服务器上的文件
        [self download];
    }
    
    #pragma mark-下载文件
    -(void)download
    {
        //1.创建请求对象
        NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/resources/video.zip"];
        ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url];
        
        //2.设置下载文件保存的路径
        NSString *cachepath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
        NSString *filename=[cachepath stringByAppendingPathComponent:@"video.zip"];
        request.downloadDestinationPath=filename;
        NSLog(@"%@",filename);
        
        //3.设置下载进度的代理
        request.downloadProgressDelegate=self.progress;
        
        //4.发送网络请求(异步)
        [request startAsynchronous];
        
        //5.下载完毕后通知
        [request setCompletionBlock:^{
            NSLog(@"文件已经下载完毕");
        }];
    }
    
    #pragma mark-监听下载进度的代理方法

    asi的文件下载还有一个属性可以设置是否支持断点下载。

    设置支持断点下载的代码如下:

     request.allowResumeForFileDownloads=YES;

    这样的话,比如一个文件已经下载了百分之30到程序的沙盒中,这个时候取消了下载。当下一次点击下载文件的时候,会接着下载剩余的百分之70并一点一点的写入到沙盒中。

    提示:取消下载的代码为:

        [request clearDelegatesAndCancel];

    三,结合一些进度显示的第三方框架使用

    去code4app上面随便下载一个显示下载进度的第三方框架,这里以DACircularProgressView为例子。

    导入该框架必要的文件后,简单使用如下。

    代码示例:

    #import "YYViewController.h"
    #import "ASIHTTPRequest.h"
    #import "DACircularProgressView.h"
    
    @interface YYViewController ()<ASIProgressDelegate>
    
    @property (weak, nonatomic) IBOutlet DACircularProgressView *circularView;
    @property (weak, nonatomic) IBOutlet UIProgressView *progress;
    @end
    
    @implementation YYViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        //设置基本的一些属性
        self.circularView.trackTintColor=[UIColor lightGrayColor];
        self.circularView.progressTintColor=[UIColor yellowColor];
    }
    
    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        //下载服务器上的文件
        [self download];
    }
    
    #pragma mark-下载文件
    -(void)download
    {
        //1.创建请求对象
        NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/resources/video.zip"];
        ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url];
        
        //2.设置下载文件保存的路径
        NSString *cachepath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
        NSString *filename=[cachepath stringByAppendingPathComponent:@"video.zip"];
        request.downloadDestinationPath=filename;
        NSLog(@"%@",filename);
        
        //3.设置下载进度的代理
        request.downloadProgressDelegate=self.circularView;
        
        //4.发送网络请求(异步)
        [request startAsynchronous];
        
        //5.设置支持断点下载
        request.allowResumeForFileDownloads=YES;
        
        //5.下载完毕后通知
        [request setCompletionBlock:^{
            NSLog(@"文件已经下载完毕");
        }];
    }
    
    #pragma mark-监听下载进度的代理方法
    @end

    显示效果:

     

    特别提示:

     

  • 相关阅读:
    gaia 开源多语言的pipeline 平台
    vernemq 集群 docker-compose 搭建简单试用
    nginx http2 push 试用
    几个方便进行micro frontend 开发的工具&&类库
    Compoxure example 应用说明
    Compoxure 微服务组合proxy 中间件
    SCS Characteristics
    How_Require_Extensions_Work
    nodejs-hook 开发
    microcks 微服务mocks 工具&&运行时
  • 原文地址:https://www.cnblogs.com/yipingios/p/5562772.html
Copyright © 2011-2022 走看看