• ASIHTTPRequest学习(三)


    刚刚开始学习ASIHttpRequest,今天通过自己写的一个小demo分享一下学习心得。

    首先,要想在ios项目中使用ASIHttpRequest,必须添加下列框架和类库:

    • ASIHttpRequest
    • CFNetwork.framework
    • SystemConfiguration.framework
    • MobileCoreServices.framework
    • CoreGraphics.framework
    • libz.dylib

    下面是我们今天要完成的任务:

    1. 下载指定链接的zip压缩文件
    2. 存放在Documents目录下
    3. 支持断点续传
    4. 显示下载进度
    5. 解压到指定目录

    那就开始吧,首先我们要创建一个ASINetworkQueue全局队列,队列里可以添加请求,虽然今天只会用到一个请求,但我们迟早会用到队列,不妨现在就开始创建:

    - (void)viewDidLoad

    {

        queue = [[ASINetworkQueue alloc] init];

        //设置支持较高精度的进度追踪

        [queue setShowAccurateProgress:YES];

        //启动

        //启动后,添加到队列的请求会自动执行

        [queue go];

    }

    紧接着创建我们的下载请求:

    - (IBAction)startDownload

    {

    //Documents路径

    NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

    //下载路径

     downloadPath = [[path stringByAppendingPathComponent:@"book.zip"] retain];

    //要支持断点续传,缓存路径是不能少的。

    NSString *tempPath = [path stringByAppendingPathComponent:@"book.temp"];

    //下载链接

    NSURL *url = [NSURL URLWithString:@"http://cnread.net/cnread1/lszl/s/simaguang/zztj/zztj.zip"];

    //创建请求

    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

    //设置代理,别忘了在头文件里添加ASIHTTPRequestDelegate协议

    request.delegate = self;

    //设置下载路径

     [request setDownloadDestinationPath:downloadPath];

    //设置缓存路径

    [request setTemporaryFileDownloadPath:tempPath];

    //设置支持断点续传

    [request setAllowResumeForFileDownloads:YES];

    //下载进度代理可以直接用UIProgressView对象,它会自动更新,如果你想做更多的处理

    //就必须用我们自定义的类,只要我们的类里实现了setPorgress:方法

    request.downloadProgressDelegate = self;

    //将请求添加到之前创建的队列里,这时请求已经开始执行了

    //队列会retain添加进去的请求

    [queue addOperation:request];

    }

    由于我们没有设置代理方法,request会执行下列默认代理方法:

    //请求开始

    - (void)requestStarted:(ASIHTTPRequest *)request;

    //请求收到响应的头部,主要包括文件大小信息,下面会用到

    - (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders;

    //请求将被重定向

    - (void)request:(ASIHTTPRequest *)request willRedirectToURL:(NSURL *)newURL;

    //请求完成

    - (void)requestFinished:(ASIHTTPRequest *)request;

    //请求失败

    - (void)requestFailed:(ASIHTTPRequest *)request;

    //请求已被重定向

    - (void)requestRedirected:(ASIHTTPRequest *)request;

    下面是我们对头部信息的处理

    - (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders

    {

        NSLog(@”%@”,responseHeaders);

        if (fileLength == 0) {

            fileLength = request.contentLength/1024.0/1024.0;

            totalPro.text = [NSString stringWithFormat:@"%.2fM",fileLength];

        }

    }

    这是打印的结果:

    {

    “Accept-Ranges” = bytes;

    “Content-Length” = 4380152;

    “Content-Type” = “application/x-zip-compressed”;

    Date = “Fri, 25 Nov 2011 11:43:20 GMT”;

    Etag = “”16d81c5cba6c71:78c”";

    “Last-Modified” = “Sun, 03 Jun 2007 18:16:52 GMT”;

    Server = “Microsoft-IIS/6.0″;

    “X-Powered-By” = “ASP.NET”;

    }

    我们可以从中看到文件大小等一些请求信息,这时request自己也知道了文件大小,所以我们直接使用request的contentLength属性,放心,大小是一样的!

    经过测试,缓存文件是在收到头部后创建的。

    这是处理进度的方法(request会自动调用该方法):

    - (void)setProgress:(float)newProgress

    {

        progressView.progress = newProgress;

        currentPro.text = [NSString stringWithFormat:@"%.2fM",fileLength*newProgress];

    }

    这样我们就可以看到进度了:

    界面比较简陋,见笑了。。。

    下面是我们的暂停方法

    - (IBAction)pauseDownload

    {

        //operations方法返回队列里的所有请求,但我们只有一个请求

        ASIHTTPRequest *request = [[queue operations] objectAtIndex:0];

        //取消请求

        [request clearDelegatesAndCancel];

    }

    你可能注意到了一个问题,因为我们的队列里只有一个请求,所以很容易获取。如果请求多了,我们应该怎么区分队列里的请求呢?有两个方法:

    1. 设置request的tag属性,就像UIView的tag一样方便,但是扩展性不强;
    2. 设置request的userInfo属性,它是个NSDictionary对象,下面不用我说了吧。

    还有一件事,我们使用了clearDelegatesAndCancel方法来取消请求,我们本可以用cancel方法来达到同样的目的,但后者会使request触发代理方法requestFailed:,而前者会首先重置request的所有代理然后执行cancel方法,所以不会触发代理方法。

    这里还要说一下,如果你的request代理在request被取消之前释放,那么代理方法被触发的时候就会crash!如果必须释放你的代理,请确定执行了clearDelegatesAndCancel方法!

    还应该注意,这里说是暂停,其实request已经完全被取消了!下面说说断点续传是怎么回事。

    其实,断点续传的功能我们在上面的代码里已经实现了。不信?

    因为我们之前开启了断点续传,并且设置了缓存路径,所以request取消时就会在缓存文件里打断点,当我们在次执行上面的startDownload方法时,缓存路径还是之前的缓存路径,request会自动从缓存文件中的断点后开始下载,头部中的文件大小值也是从断点之后开始算的。神奇吧,ASIHTTPRequest已经为你打点好了一切。

    继续,当请求完成时,也就是我们的文件已经下载好了的时候,下载好的文件会在我们之前指定的下载路径下生成,同时缓存文件会被删除,具体谁先谁后目前还没有弄清楚。

    现在我们的压缩文件已经下载好了,可怎么打开呢,双击?NO,继续:

    为了使用解压缩,我引用了第三方类库:

    解压缩的代码如下:

    - (IBAction)unzipFile

    {

        //初始化Documents路径

        NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

        //创建文件夹路径,这将是解压的目的路径

        unzipPath = [[path stringByAppendingPathComponent:@"bookUnzip"] retain];

        //创建解压器

        ZipArchive *unzip = [[ZipArchive alloc] init];

        if ([unzip UnzipOpenFile:downloadPath]) {

            //解压

            BOOL result = [unzip UnzipFileTo:unzipPath overWrite:YES];

            if (result) {

                NSLog(@”解压成功!”);

            }

            [unzip UnzipCloseFile];

        }

        [unzip release];

    }

    OK!解压成功,现在应该可以看到解压后的文件了:

    大功告成!!!

    现在回头看看一开始的任务:

    • 下载指定链接的zip压缩文件
    • 存放在Documents目录下
    • 支持断点续传
    • 显示下载进度
    • 解压到指定目录

    没错都完成了!下面是我的项目文件,里面添加了删除和阅读功能:

    参考:

    第一次这么正经的写博客,很不习惯,以后尽量多写,谢谢观看!!!

  • 相关阅读:
    nginx的简介和配置文件实例(一)
    Tomcat基础配置(一)
    redis主从复制以及SSDB主主复制环境部署记录(四)
    redis主从原理介绍(三)
    redis介绍和安装和主从介绍(二)
    celery
    网络-sdn
    djang问题汇总
    django路由url
    django开发环境配置
  • 原文地址:https://www.cnblogs.com/lisa090818/p/3165309.html
Copyright © 2020-2023  润新知