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会把已经下载好的数据放到沙盒缓存,下次再下载时,会自动将新数据拼接到已下载好的旧数据上.

  • 相关阅读:
    【AtCoder Regular Contest 080E】Young Maids [堆][线段树]
    【AtCoder Grand Contest 007E】Shik and Travel [Dfs][二分答案]
    【Codeforces858F】Wizard's Tour [构造]
    【AtCoder Grand Contest 001F】Wide Swap [线段树][拓扑]
    【AtCoder Grand Contest 012C】Tautonym Puzzle [构造]
    【Foreign】动态规划 [分治][DP]
    【BZOJ2683】简单题 [分治][树状数组]
    【BZOJ4237】稻草人 [分治][单调栈]
    【BZOJ3745】Norma [分治]
    【BZOJ4552】【HEOI2016】排序 [二分答案][线段树]
  • 原文地址:https://www.cnblogs.com/oumygade/p/4249323.html
Copyright © 2011-2022 走看看