ASIHTTPRequest系列 二 文件下载

本文介绍如何使用ASIHTTPRequest和NSOperationQueue实现iOS应用中的多线程下载功能,包括下载进度的精确显示,适用于同时下载多个文件或提高单一文件下载速度。

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

四、下载

1、简单下载

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

-(IBAction)goURL{

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

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

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

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL: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;

bool failed;

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=[NSFileManager defaultManager];

}

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

// 文件1

NSString* file1= @"image.png";

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

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

NSString*path1=[userDocPath stringByAppendingPathComponent:file1];

bool b=[fm createFileAtPath:path1 contents:nil attributes:nil];

NSFileHandle *fh1;

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

if(b){

fh1=[NSFileHandle fileHandleForWritingAtPath:path1];

}

// 文件2

NSString* file2= @"plsqldev714.rar";

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

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

NSString*path2=[userDocPath stringByAppendingPathComponent:file2];

b=[fm createFileAtPath:path2 contents:nil attributes:nil];

NSFileHandle *fh2;

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

if(b){

fh2=[NSFileHandle fileHandleForWritingAtPath:path2];

}

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

if (!networkQueue) {

networkQueue = [[ASINetworkQueue alloc] init];

}

failed = NO;

[networkQueue reset]; // 队列清零

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

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

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

ASIHTTPRequest *request;

 

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

request = [ASIHTTPRequest requestWithURL:url1]; // 设置文件1url

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

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

    [request setUserInfo:[NSDictionary dictionaryWithObject: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_file1 setText:[NSString stringWithFormat:@"%.1fK",fSize1/1000.0]];

[status_total setText:[NSString stringWithFormat:@"%.0f%%",progress_total.progress*100]];

if (fh1!=nil) {

[fh1 seekToEndOfFile];

[fh1 writeData:data];

}

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

}];

[networkQueue addOperation:request];

 

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

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

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

    [request setUserInfo:[NSDictionary dictionaryWithObject: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_file2 setText:[NSString stringWithFormat:@"%.1fK",fSize2/1000.0]];

基于STM32 F4的永磁同步电机无位置传感器控制策略研究内容概要:本文围绕基于STM32 F4的永磁同步电机(PMSM)无位置传感器控制策略展开研究,重点探讨在不依赖物理位置传感器的情况下,如何通过算法实现对电机转子位置和速度的精确估计与控制。文中结合嵌入式开发平台STM32 F4,采用如滑模观测器、扩展卡尔曼滤波或高频注入法等先进观测技术,实现对电机反电动势或磁链的估算,进而完成无传感器矢量控制(FOC)。同时,研究涵盖系统建模、控制算法设计、仿真验证(可能使用Simulink)以及在STM32硬件平台上的代码实现与调试,旨在提高电机控制系统的可靠性、降低成本并增强环境适应性。; 适合人群:具备一定电力电子、自动控制理论基础和嵌入式开发经验的电气工程、自动化及相关专业的研究生、科研人员及从事电机驱动开发的工程师。; 使用场景及目标:①掌握永磁同步电机无位置传感器控制的核心原理与实现方法;②学习如何在STM32平台上进行电机控制算法的移植与优化;③为开发高性能、低成本的电机驱动系统提供技术参考与实践指导。; 阅读建议:建议读者结合文中提到的控制理论、仿真模型与实际代码实现进行系统学习,有条件者应在实验平台上进行验证,重点关注观测器设计、参数整定及系统稳定性分析等关键环节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值