您的位置:首页 > 理论基础 > 计算机网络

ASIHTTPRequest下载文件

2013-04-29 23:46 344 查看
1、简单下载

打开IB,拖入一个Progress View,在源文件中声明为IBOutlet,然后进行连接。

-(IBAction)goURL{

NSString* path=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES) objectAtIndex:0];

path=[path stringByAppendingPathComponent:
@"plsqldev714.rar"];

NSURL *url = [NSURLURLWithString:@"http://localhost/upload/plsqldev714.rar"];

ASIHTTPRequest *request = [ASIHTTPRequestrequestWithURL:url];

[request setDownloadDestinationPath:path];

[request setDownloadProgressDelegate:progressView];

[request startSynchronous];

}

运行程序,下载进度会在progress view中显示。下载进度显示当前完成的大约比例。

2、使用队列下载并显示进度条

队列是指 NSOperationQueue 对象,其实是一种多线程操作,可以同时执行多个下载任务,甚至多线程下载同一任务(当然需要服务器支持,把同一个文件资源分成多个线程同时下载,最后再合并为一个文件)。下面的例子里我们使用了NSOperationQueue 同时进行多个下载任务,同时,Progress View显示精确进度。

这个例子需要对界面进行一些设计。为简便,我们使用 IB 设计界面。

新建一个ViewController类。Add->NewFile,选择UIViewController subclass,并勾上“With XIB for user interface”,命名为QueueViewController。

用 IB 打开 Xib 文件,在其中拖入6个UILable、1个UIButton和3个UIProgressView:



在Xcode中声明必要的变量和 IBOutlet/IBAction:

#import <UIKit/UIKit.h>

#import "ASIHTTPRequest.h"

#import "ASINetworkQueue.h"

@interface QueueViewController : UIViewController {

ASINetworkQueue *networkQueue;

UILabel *status_total,*status_file1,*status_file2;

UIButton *button;

UIProgressView *progress_total,*progress_file1,*progress_file2;

boolfailed;

NSFileManager*
fm;

}

@property (nonatomic,retain)IBOutlet
UILabel*status_file2,*status_file1,*status_total;

@property (nonatomic,retain)IBOutlet
UIButton *button;

@property (nonatomic,retain)IBOutlet
UIProgressView*progress_file1,*progress_file2,*progress_total;

-(IBAction)go:(id)sender;

@end

将所有出口正确地连接到QueueViewController.xib 中,保存。

打开MainWindow.xib,拖一个UIViewController进去并将其Identifier改为QueueViewController,再将它连接到Window对象的的rootViewController。

编写 UIButton 的 Touch up inside 事件代码如下:

-(IBAction)go:(id)sender{

if(fm==nil) {

fm=[NSFileManagerdefaultManager];

}

NSString* userDocPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES) objectAtIndex:0];

// 文件1

NSString* file1=
@"image.png";

NSURL *url1 = [NSURLURLWithString:@"http://220.163.103.23/interface/GetAttach?Accounts=sa&Password=ydtf@95598&AttachID=26"];

// 先创建文件file1,再用NSFileHandle
打开它

NSString*path1=[userDocPath
stringByAppendingPathComponent:file1];

bool b=[fmcreateFileAtPath:path1
contents:nilattributes:nil];

NSFileHandle *fh1;

__blockuint fSize1=0;
// 以 B
为单位,记录已下载的文件大小,需要声明为块可写

if(b){

fh1=[NSFileHandlefileHandleForWritingAtPath:path1];

}

// 文件2

NSString* file2=
@"plsqldev714.rar";

NSURL *url2 = [NSURLURLWithString:@"http://220.163.103.23/upload/plsqldev714.rar"];

// 先创建文件file2,再用NSFileHandle
打开它

NSString*path2=[userDocPath
stringByAppendingPathComponent:file2];

b=[fmcreateFileAtPath:path2
contents:nilattributes:nil];

NSFileHandle *fh2;

__blockuint fSize2=0;
// 以 B
为单位,记录已下载的文件大小,需要声明为块可写

if(b){

fh2=[NSFileHandlefileHandleForWritingAtPath:path2];

}

////////////////////////////任务队列 /////////////////////////////

if (!networkQueue) {

networkQueue = [[ASINetworkQueuealloc]
init];

}

failed = NO;

[networkQueuereset];
// 队列清零

[networkQueuesetDownloadProgressDelegate:progress_total];
// 设置queue进度条

[networkQueuesetShowAccurateProgress:YES];
// 进度精确显示

[networkQueuesetDelegate:self];
// 设置队列的代理对象

ASIHTTPRequest *request;

/////////////////request for file1 //////////////////////

request = [ASIHTTPRequestrequestWithURL:url1];
// 设置文件1的url

[request setDownloadProgressDelegate:progress_file1];
// 文件1的下载进度条

// 设置 userInfo,可用于识别不同的 request
对象

[request setUserInfo:[NSDictionarydictionaryWithObject:file1
forKey:@"TargetPath"]];

// 使用complete
块,在下载完时做一些事情

[request setCompletionBlock:^(void){

NSLog(@"%@complete !",file1);

assert(fh1);

// 关闭 file1

[fh1 closeFile];

}];

// 使用 failed
块,在下载失败时做一些事情

[request setFailedBlock:^(void){

NSLog(@"%@download failed !",file1);}

];

// 使用 received
块,在接受到数据时做一些事情

[request setDataReceivedBlock:^(NSData* data){

fSize1+=data.length;

[status_file1setText:[NSStringstringWithFormat:@"%.1fK",fSize1/1000.0]];

[status_totalsetText:[NSStringstringWithFormat:@"%.0f%%",progress_total.progress*100]];

if (fh1!=nil) {

[fh1 seekToEndOfFile];

[fh1 writeData:data];

}

NSLog(@"%@:%u",file1,data.length);

}];

[networkQueueaddOperation:request];

/////////////request for file2 //////////////////

request = [[[ASIHTTPRequestalloc]
initWithURL:url2]
autorelease];
// 设置文件2的url

[request setDownloadProgressDelegate:progress_file2];
// 文件2的下载进度条

[request setUserInfo:[NSDictionarydictionaryWithObject:file2
forKey:@"TargetPath"]];

// 使用complete
块,在下载完时做一些事情

[request setCompletionBlock:^(void){

NSLog(@"%@complete !",file2);

assert(fh2);

// 关闭 file2

[fh2 closeFile];

}];

// 使用 failed
块,在下载失败时做一些事情

[request setFailedBlock:^(void){

NSLog(@"%@download failed !",file2);

}];

// 使用 received
块,在接受到数据时做一些事情

[request setDataReceivedBlock:^(NSData* data){

fSize2+=data.length;

[status_file2setText:[NSStringstringWithFormat:@"%.1fK",fSize2/1000.0]];

[status_totalsetText:[NSStringstringWithFormat:@"%.0f%%",progress_total.progress*100]];

if (fh2!=nil) {

[fh2 seekToEndOfFile];

[fh2 writeData:data];

}

}];

[networkQueueaddOperation:request];

[networkQueuego];
// 队列任务开始

}

运行效果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: