IOS开发网络篇之──ASIHTTPRequest下载示例(支持断点续传)【转】

本文详细介绍使用ASIHTTPRequest实现文件下载及断点续传的方法。包括创建网络请求队列、设置下载路径、发送下载请求、暂停请求等步骤,并提供ASIHTTPRequestDelegate回调方法的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来自:http://blog.csdn.net/pjk1129/article/details/6593264

在工程中,我们会常常遇到需要下载的程序,比如下载在线音乐、下载图片等等,今天我将介绍一下利用ASIHTTPRequest的下载示例,支持断点续传,利用ASIHTTPRequest下载以及断点续传的原理在我的博客:http://blog.csdn.NET/pjk1129/article/details/6575588中有具体的介绍,今天重点介绍如何实现,废话少说,开始正文:

一、创建网络请求队列

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

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; 
}

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


在IT领域,尤其是地理信息系统(GIS)中,坐标换是一项关键技术。本文将深入探讨百度坐标系、火星坐标系和WGS84坐标系之间的相互换,并介绍如何使用相关工具进行批量换。 首先,我们需要了解这三种坐标系的基本概念。WGS84坐标系,即“World Geodetic System 1984”,是一种全球通用的地球坐标系统,广泛应用于GPS定位和地图服务。它以地球椭球模型为基础,以地球质心为原点,是国际航空和航海的主要参考坐标系。百度坐标系(BD-09)是百度地图使用的坐标系。为了保护隐私和安全,百度对WGS84坐标进行了偏移处理,导致其与WGS84坐标存在差异。火星坐标系(GCJ-02)是中国国家测绘局采用的坐标系,同样对WGS84坐标进行了加密处理,以防止未经授权的精确位置获取。 坐标换的目的是确保不同坐标系下的地理位置数据能够准确对应。在GIS应用中,通常通过特定的算法实现换,如双线性内插法或四参数换法。一些“坐标换小工具”可以批量换百度坐标、火星坐标与WGS84坐标。这些工具可能包含样本文件(如org_xy_格式参考.csv),用于提供原始坐标数据,其中包含需要换的经纬度信息。此外,工具通常会附带使用指南(如重要说明用前必读.txt和readme.txt),说明输入数据格式、换步骤及可能的精度问题等。x86和x64目录则可能包含适用于32位和64位操作系统的软件或库文件。 在使用这些工具时,用户需要注意以下几点:确保输入的坐标数据准确无误,包括经纬度顺序和浮点数精度;按照工具要求正确组织数据,遵循读写规则;注意换精度,不同的换方法可能会产生微小误差;在批量换时,检查每个坐标是否成功换,避免个别错误数据影响整体结果。 坐标换是GIS领域的基础操作,对于地图服务、导航系统和地理数据分析等至关重要。理解不同坐标系的特点和换方法,有助于我们更好地处
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值