zoukankan      html  css  js  c++  java
  • iOS ASI--文件下载

    1.方法一:如果NSData数据很大,把很大的数据装进内存,内存肯定会爆掉,所以这种方法不可取

        // 设置url

        NSURL *url = [NSURL URLWithString:@"http://localhost/123.jpg"];

        // 设置请求

        self.request = [ASIHTTPRequest requestWithURL:url];

        // 接收到服务器返回的数据

        [self.request setDataReceivedBlock:^(NSData *data) {

            NSLog(@"-----%d",data.length);

        }];

        // 发起请求

        [self.request startAsynchronous];

    2.方法二:

        // 设置url

        NSURL *url = [NSURL URLWithString:@"http://localhost/123.jpg"];

        // 设置请求

        self.request = [ASIHTTPRequest requestWithURL:url];

        // 设置文件本地存放的路径

        NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];

        NSString *cachePath = [cache stringByAppendingPathComponent:@"cache.db"];

        [self.request setDownloadDestinationPath:cachePath];

        // 下载完成时调用

        [self.request setCompletionBlock:^{

            NSLog(@"下载完咯,用ASI下载,就是这么轻轻松松搞定!");

        }];

        // 发起请求

        [self.request startAsynchronous];

    3. 监听下载的进度,先要遵守ASIProgressDelegate协议

        // 设置url

        NSURL *url = [NSURL URLWithString:@"http://localhost/123.jpg"];

        // 设置请求

        self.request = [ASIHTTPRequest requestWithURL:url];

        // 设置文件本地存放的路径

        NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];

        NSString *cachePath = [cache stringByAppendingPathComponent:@"cache.db"];

        [self.request setDownloadDestinationPath:cachePath];

        // 设置下载进度代理 

      self.request.downloadProgressDelegate = self;

        // 接收到服务器返回的数据

        [self.request setCompletionBlock:^{

            NSLog(@"下载完咯");

        }];

        // 发起请求

        [self.request startAsynchronous];

    }

    #pragma mark - ASIProgressDelegate

    - (void)setProgress:(float)newProgress{

        NSLog(@"下载进度:%f",newProgress);

    }

    补充:如果能拿到进度条控件,监听下载进度还有一种写法

    self.request.downloadProgressDelegate = self.progressView;

    /*   代理方法可以省略不写,因为把self.progressView有progress属性,意味着progressView内部已经实现了progress的set方法,正好downloadProgressDelegate的代理方法就是setProgress: ,所以下面这段代码可以省略

    - (void)setProgress:(float)newProgress{

        self.progressView.progress = newProgress

    }   */

    4.支持断点续传   [self.request setAllowResumeForFileDownloads:YES];  把这句代码加上就OK了

    原理:假设有个按钮,点击按钮执行这个方法 [self.request clearDelegatesAndCancel];然后ASI会把已经下载好的数据放到沙盒缓存,下次再下载时,会自动将新数据拼接到已下载好的旧数据上.

  • 相关阅读:
    Candy leetcode java
    Trapping Rain Water leetcode java
    Best Time to Buy and Sell Stock III leetcode java
    Best Time to Buy and Sell Stock II leetcode java
    Best Time to Buy and Sell Stock leetcode java
    Maximum Subarray leetcode java
    Word Break II leetcode java
    Word Break leetcode java
    Anagrams leetcode java
    Clone Graph leetcode java(DFS and BFS 基础)
  • 原文地址:https://www.cnblogs.com/oumygade/p/4249323.html
Copyright © 2011-2022 走看看