zoukankan      html  css  js  c++  java
  • IOS开发网络篇之──ASIHTTPRequest下载示例(支持断点续传)


        一、创建网络请求队列

        首先,创建网络请求队列,如下:

        ASINetworkQueue   *que = [[ASINetworkQueue alloc] init];

        self.netWorkQueue = que;

        [que release];

     

        [self.netWorkQueue reset];

        [self.netWorkQueue setShowAccurateProgress:YES];

        [self.netWorkQueue go];

     

      二、创建存放路径

        //初始化Documents路径

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

    //初始化临时文件路径

    NSString *folderPath = [path stringByAppendingPathComponent:@"temp"];

    //创建文件管理器

    NSFileManager *fileManager = [NSFileManager defaultManager];

    //判断temp文件夹是否存在

    BOOL fileExists = [fileManager fileExistsAtPath:folderPath];

    if (!fileExists) {//如果不存在说创建,因为下载时,不会自动创建文件夹

    [fileManager createDirectoryAtPath:folderPath 

                   withIntermediateDirectories:YES 

                                    attributes:nil

                                         error:nil];

    }

            三、发送下载请求

            这里对下面几个对象说明一下:CustomCell是我自定义的cell,cell上面有下载和暂停两个按钮,其tag值为cell所在的行,因此这里的[sendertag]为下载按钮的tag值,self.downloadArray为array数组对象,存放要下载的资源字典信息,在该字典中有一键为URL,它对应的值就是我们下载链接。

       这些东西,根据自己的实际需要改动一下即可使用

        CustomCell *cell = (CustomCell *)[self.myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:[sender tag] inSection:0]];

        NSString  *filePath = [[self.downloadArray objectAtIndex:[sender tag]] objectForKey:@"URL"];

        NSLog(@"filePath=%@",filePath);

        //初始下载路径

    NSURL *url = [NSURL URLWithString:filePath];

    //设置下载路径

    ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:url];

    //设置ASIHTTPRequest代理

    request.delegate = self;

        //初始化保存ZIP文件路径

    NSString *savePath = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"book_%d.zip",[sender tag]]];

    //初始化临时文件路径

    NSString *tempPath = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"temp/book_%d.zip.temp",[sender tag]]];

    //设置文件保存路径

    [request setDownloadDestinationPath:savePath];

    //设置临时文件路径

    [request setTemporaryFileDownloadPath:tempPath];

     

        //设置进度条的代理,

    [request setDownloadProgressDelegate:cell];

    //设置是是否支持断点下载

    [request setAllowResumeForFileDownloads:YES];

    //设置基本信息

    [request setUserInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:[sender tag]],@"bookID",nil]];

     

        NSLog(@"UserInfo=%@",request.userInfo);

    //添加到ASINetworkQueue队列去下载

    [self.netWorkQueue addOperation:request];

    //收回request

    [request release];

        三、暂停请求

        这里的cell下下载时的一样,

    CustomCell *cell = (CustomCell *)[self.myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:[sender tag] inSection:0]];

     

        for (ASIHTTPRequest *request in [self.netWorkQueue operations]) {

            NSInteger bookid = [[request.userInfo objectForKey:@"bookID"] intValue];//查看userinfo信息

            if ([sender tag] == bookid) {//判断ID是否匹配

                //暂停匹配对象

                [request clearDelegatesAndCancel];

            }

        }

     

        四、ASIHTTPRequestDelegate回调方法

              上面已经把下载请求与暂停请求实现,点击下载时,开始下载资源;当点暂停时,下载中断;当我们再点击下载按钮时,继续下载,在第二步的

    [request setAllowResumeForFileDownloads:YES]设置是是否支持断点下载。下面要实现ASIHTTPRequestDelegate代理方法如下:

    #pragma mark -

    #pragma mark ASIHTTPRequestDelegate method

    //ASIHTTPRequestDelegate,下载之前获取信息的方法,主要获取下载内容的大小,可以显示下载进度多少字节

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

    NSLog(@"didReceiveResponseHeaders-%@",[responseHeaders valueForKey:@"Content-Length"]);

     

        NSLog(@"contentlength=%f",request.contentLength/1024.0/1024.0);

        int bookid = [[request.userInfo objectForKey:@"bookID"] intValue];

        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

        float tempConLen = [[userDefaults objectForKey:[NSString stringWithFormat:@"book_%d_contentLength",bookid]] floatValue];

        NSLog(@"tempConLen=%f",tempConLen);

        //如果没有保存,则持久化他的内容大小

        if (tempConLen == 0 ) {//如果没有保存,则持久化他的内容大小

            [userDefaults setObject:[NSNumber numberWithFloat:request.contentLength/1024.0/1024.0] forKey:[NSString stringWithFormat:@"book_%d_contentLength",bookid]];

        }

     

    }

    //ASIHTTPRequestDelegate,下载完成时,执行的方法

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

     

        int bookid = [[request.userInfo objectForKey:@"bookID"] intValue];

        CustomCell *cell = (CustomCell *)[self.myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:bookid inSection:0]];

        cell.downloadCompleteStatus = YES;

        cell.progressView.progress = 0.0; 

    }


        经过上述步骤,一个支持断点续传的功能程序实现了!

  • 相关阅读:
    Cocos2d-x 学习笔记(11.1) MoveBy MoveTo
    Cocos2d-x 学习笔记(10) ActionInstant
    Cocos2d-x 学习笔记(9) Action 运行原理
    Cocos2d-x 学习笔记(8) ActionManager
    Cocos2d-x 学习笔记(7) 内存管理 Sprite SpriteFrame Texture2D
    Cocos2d-x 学习笔记(6) Sprite SpriteFrameCache Texture2D TextureCache
    常见串口术语区分
    串口调试
    Linux
    缓冲区
  • 原文地址:https://www.cnblogs.com/a7345678/p/2565858.html
Copyright © 2011-2022 走看看