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

    显示效果:

     

    特别提示:

     

  • 相关阅读:
    unsupported jsonb version number 123
    如何在MPlayer上支持RTSP
    TDengine 时序数据库的 ADO.Net Core 提供程序 Maikebing.EntityFrameworkCore.Taos
    如何使用IoTSharp对接ModBus?
    如何从源码启动和编译IoTSharp
    Asp.Net Core 自动适应Windows服务、Linux服务、手动启动时的内容路径的扩展方法
    MQTTnet 的Asp.Net Core 认证事件的扩展
    Asp.Net Core 中利用QuartzHostedService 实现 Quartz 注入依赖 (DI)
    The remote certificate is invalid according to the validation procedure 远程证书验证无效
    settings插拔式源码
  • 原文地址:https://www.cnblogs.com/yipingios/p/5562772.html
Copyright © 2011-2022 走看看