ASIHTTPRequest获取精准进度百分比 使用Block回调
2014-01-22 16:20
330 查看
在ASIHttp请求类中的.h文件中声明BLOCK
typedef void(^getProgress)(float ProgressNum);
在请求的方法中添加此代码段:
__block float newProgress;
__block float totalSize = 0;
__block float theSize = 0;
//这个方法会调用两次
[request setUploadSizeIncrementedBlock:^(long long size) {
totalSize = totalSize + size;
// NSLog(@"totalSize ===== %f",totalSize);
}];
//在队列上传的时候需要加上total这个修正值
[request setBytesSentBlock:^(unsigned long long size, unsigned long long total) {
//the total is 修正量
theSize += size;
// NSLog(@"size ===== %lld", size);
// NSLog(@"pro ===== %f",theSize/totalSize);
newProgress = theSize/totalSize;
if (proBlock != nil) {
proBlock(newProgress);
}
}];
例子:
// 上传视频接 (请求类中,在这里使用回调的Block)
+ (ASIHTTPRequest *)requestWithMovieURL:(NSString *)urlstring
params:(NSDictionary *)params
url:(NSURL *)fileUrl
dataType:(NSString *)type
block:(CompletionLoadHandle)block
proBlock:(getProgress)proBlock
{
if (params == nil) {
params = [NSMutableDictionary dictionary];
}
// 如果是GET请求,将参数拼接到url后面
NSMutableString *url = [NSMutableString stringWithFormat:@"%@%@",LIFENGHANINTERFACE,urlstring];
// 创建request请求
__weak __block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:url]];
// 请求方式
[request setUploadProgressDelegate:self];
request.showAccurateProgress = YES;
[request setRequestMethod:@"POST"];
[request setTimeOutSeconds:60];
// 判断是否为POST请求,向请求体中添加参数
for (NSString *key in params) {
// 取到请求参数的value
id value = [params objectForKey:key];
// 判断是否为文件数据
if ([value isKindOfClass:[NSData class]]) {
// [request addData:value forKey:key];
// NSData *videoData = [[NSData alloc] initWithContentsOfURL:fileUrl];
[request setData:value withFileName:@".3gp" andContentType:nil forKey:key];
} else {
[request addPostValue:value forKey:key];
}
}
// 数据返回的处理
[request setCompletionBlock:^{
// 取出相应请求的文件数据
NSData *jsonData = request.responseData;
// 取出数据,用block回调过去
id result = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:nil];
if (block != nil) {
block(result);
}
}];
// 请求失败
[request setFailedBlock:^{
NSLog(@"请求失败:%@",request.error);
NSString *error = @"0";
if (block != nil) {
block(error);
}
}];
__block float newProgress;
__block float totalSize = 0;
__block float theSize = 0;
//这个方法会调用两次
[request setUploadSizeIncrementedBlock:^(long long size) {
totalSize = totalSize + size;
// NSLog(@"totalSize ===== %f",totalSize);
}];
//在队列上传的时候需要加上total这个修正值
[request setBytesSentBlock:^(unsigned long long size, unsigned long long total) {
//the total is 修正量
theSize += size;
// NSLog(@"size ===== %lld", size);
// NSLog(@"pro ===== %f",theSize/totalSize);
newProgress = theSize/totalSize;
if (proBlock != nil) {
proBlock(newProgress);
}
}];
// 发送异步请求
[request startAsynchronous];
return request;
}
//发布视频(viewcontroller中,在这里使用回调的Block)
-(void)_publishVideoAction : (NSURL *)_url
{
// 添加视频接口
// 请求:
// userid:会员id
//
// 返回:
// code:状态码
// msg:状态中文说明
// userid:会员id
// transcript: 考试成绩
// newtime:距离下一次考试时间
//http://192.168.1.5/huirui/interface/getunewsAction.php?userid=1
[super showMBProgressHUD:@"上传视频中..."];
[self moveInView];
NSData *videoData = [[NSData alloc] initWithContentsOfURL:url];
NSDictionary *dic = @{@"userid":@"1",@"pic":videoData};
[FCDataService requestWithMovieURL:@"addvedioAction.php" params:dic url:url dataType:@".3gp" block:^(id result) {
NSLog(@"上传视频完成");
// [super hiddenMBProgressHUD];
// [self moveOutView];
} proBlock:^(float ProgressNum) {
NSLog(@"进度条:%.2f",ProgressNum);
//[self setUpdataView:ProgressNum];
}];
}
typedef void(^getProgress)(float ProgressNum);
在请求的方法中添加此代码段:
__block float newProgress;
__block float totalSize = 0;
__block float theSize = 0;
//这个方法会调用两次
[request setUploadSizeIncrementedBlock:^(long long size) {
totalSize = totalSize + size;
// NSLog(@"totalSize ===== %f",totalSize);
}];
//在队列上传的时候需要加上total这个修正值
[request setBytesSentBlock:^(unsigned long long size, unsigned long long total) {
//the total is 修正量
theSize += size;
// NSLog(@"size ===== %lld", size);
// NSLog(@"pro ===== %f",theSize/totalSize);
newProgress = theSize/totalSize;
if (proBlock != nil) {
proBlock(newProgress);
}
}];
例子:
// 上传视频接 (请求类中,在这里使用回调的Block)
+ (ASIHTTPRequest *)requestWithMovieURL:(NSString *)urlstring
params:(NSDictionary *)params
url:(NSURL *)fileUrl
dataType:(NSString *)type
block:(CompletionLoadHandle)block
proBlock:(getProgress)proBlock
{
if (params == nil) {
params = [NSMutableDictionary dictionary];
}
// 如果是GET请求,将参数拼接到url后面
NSMutableString *url = [NSMutableString stringWithFormat:@"%@%@",LIFENGHANINTERFACE,urlstring];
// 创建request请求
__weak __block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:url]];
// 请求方式
[request setUploadProgressDelegate:self];
request.showAccurateProgress = YES;
[request setRequestMethod:@"POST"];
[request setTimeOutSeconds:60];
// 判断是否为POST请求,向请求体中添加参数
for (NSString *key in params) {
// 取到请求参数的value
id value = [params objectForKey:key];
// 判断是否为文件数据
if ([value isKindOfClass:[NSData class]]) {
// [request addData:value forKey:key];
// NSData *videoData = [[NSData alloc] initWithContentsOfURL:fileUrl];
[request setData:value withFileName:@".3gp" andContentType:nil forKey:key];
} else {
[request addPostValue:value forKey:key];
}
}
// 数据返回的处理
[request setCompletionBlock:^{
// 取出相应请求的文件数据
NSData *jsonData = request.responseData;
// 取出数据,用block回调过去
id result = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:nil];
if (block != nil) {
block(result);
}
}];
// 请求失败
[request setFailedBlock:^{
NSLog(@"请求失败:%@",request.error);
NSString *error = @"0";
if (block != nil) {
block(error);
}
}];
__block float newProgress;
__block float totalSize = 0;
__block float theSize = 0;
//这个方法会调用两次
[request setUploadSizeIncrementedBlock:^(long long size) {
totalSize = totalSize + size;
// NSLog(@"totalSize ===== %f",totalSize);
}];
//在队列上传的时候需要加上total这个修正值
[request setBytesSentBlock:^(unsigned long long size, unsigned long long total) {
//the total is 修正量
theSize += size;
// NSLog(@"size ===== %lld", size);
// NSLog(@"pro ===== %f",theSize/totalSize);
newProgress = theSize/totalSize;
if (proBlock != nil) {
proBlock(newProgress);
}
}];
// 发送异步请求
[request startAsynchronous];
return request;
}
//发布视频(viewcontroller中,在这里使用回调的Block)
-(void)_publishVideoAction : (NSURL *)_url
{
// 添加视频接口
// 请求:
// userid:会员id
//
// 返回:
// code:状态码
// msg:状态中文说明
// userid:会员id
// transcript: 考试成绩
// newtime:距离下一次考试时间
//http://192.168.1.5/huirui/interface/getunewsAction.php?userid=1
[super showMBProgressHUD:@"上传视频中..."];
[self moveInView];
NSData *videoData = [[NSData alloc] initWithContentsOfURL:url];
NSDictionary *dic = @{@"userid":@"1",@"pic":videoData};
[FCDataService requestWithMovieURL:@"addvedioAction.php" params:dic url:url dataType:@".3gp" block:^(id result) {
NSLog(@"上传视频完成");
// [super hiddenMBProgressHUD];
// [self moveOutView];
} proBlock:^(float ProgressNum) {
NSLog(@"进度条:%.2f",ProgressNum);
//[self setUpdataView:ProgressNum];
}];
}
相关文章推荐
- ASIHttpRequest block在ARC下使用时出错circle retain的问题及解决方法
- ASIHttpRequest中Block代码块的使用和注意事项
- 几篇网文利用Block回调,ASIHTTPRequest 实现登录验证
- iOS开发asi使用(三)ASIHTTPRequest进度追踪
- ASIHTTPRequest使用介绍 --进度显示
- ASIHttprequest的使用
- iOS开发ASIHTTPRequest进度追踪
- ASIHTTPRequest类库简介和使用说明
- ASIHttpRequest 类库的使用说明
- ASIHttprequest使用详解
- ASIHTTPRequest-进度追踪
- ASIHTTPRequest的使用——请求HTTPS
- iOS开发asi使用(二)ASIHttpRequest发送数据
- 使用ASIHTTPRequest获得天气信息
- 开源库ASIHTTPRequest使用介绍
- 使用ASIHttpRequest调用WebService
- iphone开发--使用ASIHTTPRequest实现下载,断点续传功能
- ASIHTTPRequest类库简介和使用说明
- c#在WinForm下使用HttpWebRequest上传文件并显示进度
- ASIHTTPRequest类库简介和使用说明