ASIHTTPRequest框架使用总结系列之阿堂教程3(异步请求)

在上一节中,阿堂和网友们分享了ASIHTTPRequest框架对于get,post的同步请求方式。很显然,如果网速比较慢,查询的时候会一直很黑屏,直到请求结束界面才出现结果,这样用户体验肯定很不好了。正如上节阿堂所说,同步请求一般只是在某个子线程中使用,而不在主线程中使用。

ASIHTTPRequest和ASIFormDataRequest两个请求类都可以发送异步请求,而后者继承了前者的异步请求方法,所以这里阿堂重点介绍ASIHTTPRequest的异步请求。异步请求后的处理通过回调委托对象的方法requestFinished: 或requestFailed:实现的。

一.对于get的异步请求

-(void)startRequest

{

NSString *strURL = [[NSString alloc]initWithFormat:@"http://www.crazyit.com/service/mynotes/webservice.php?email=%@&type=%@&action=%@",@"[email protected]",@"JSON",@"query"];

NSURL *url = [NSURL URLWithString:[strURL URLEncodedString]];

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

//设置委托对象为self

[request setDelegate:self];

//自定议回调方法 requestSuccess, requestError (方法名字可以随便取)

//如果没有设置回调方法,如下两行不需要,会默认调用 requestFinished, requestFailed 方法

[request setDidFinishSelector:@selector(requestSuccess:)];

[request setDidFailSelector:@selector(requestError:)];

[request startAsynchronous];

}

- (void)requestSuccess:(ASIHTTPRequest *)request

{

NSData *data  = [request responseData];

NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:dataoptions:NSJSONReadingAllowFragments error:nil];

[self reloadView:resDict];

}

- (void)requestError:(ASIHTTPRequest *)request

{

NSError *error = [request error];

NSLog(@"%@", [error localizedDescription]);

}

//重新加载表视图

-(void)reloadView:(NSDictionary*)res

{

NSNumber *resultCodeObj = [res objectForKey:@"ResultCode"];

if ([resultCodeObj integerValue] >=0)

{

self.listData = [res objectForKey:@"Record"];

[self.tableView reloadData];

} else {

NSString *errorStr = [resultCodeObj errorMessage];

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"错误信息"

message:errorStr

delegate:nil

cancelButtonTitle:@"OK"

otherButtonTitles: nil];

[alertView show];

}

}

测试截图

二. 对于get异步请求的代码Block块指定回调方法

-(void)startRequest

{

NSString *strURL = [[NSString alloc]initWithFormat:@"http://www.crazyit.com/service/mynotes/webservice.php?email=%@&type=%@&action=%@",@"[email protected]",@"JSON",@"query"];

NSURL *url = [NSURL URLWithString:[strURL URLEncodedString]];

__weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

[request setCompletionBlock:^{

NSData *data  = [request responseData];

NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:dataoptions:NSJSONReadingAllowFragments error:nil];

[self reloadView:resDict];

}];

[request setFailedBlock:^{

NSError *error = [request error];

NSLog(@"%@", [error localizedDescription]);

}];

[request startAsynchronous];

}

//重新加载表视图

-(void)reloadView:(NSDictionary*)res

{

if (self.refreshControl) {

[self.refreshControl endRefreshing];

self.refreshControl.attributedTitle = [[NSAttributedString alloc]initWithString:@"下拉刷新"];

}

NSNumber *resultCodeObj = [res objectForKey:@"ResultCode"];

if ([resultCodeObj integerValue] >=0)

{

self.listData = [res objectForKey:@"Record"];

[self.tableView reloadData];

} else {

NSString *errorStr = [resultCodeObj errorMessage];

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"错误信息"

message:errorStr

delegate:nil

cancelButtonTitle:@"OK"

otherButtonTitles: nil];

[alertView show];

}

}

说明:

setCompletionBlock:^{...} 和 setFailedBlcok:^{...}调用的代码块,这两个方法分别在成功和失败时回调。使用代码块会有一些小问题,它可能会造成循环保持(retain cycle)问题。循环保存是一个内存问题,假设a对象保持了b对象,b对象又保持了a对象,a和b都无法翻释放。为了解决代码块循环问题。我们在声明ASIHTTPRequest对象之前使用了_ _ weak关健字,它的意思是ASIHTTPRequest对象是弱引用,这一点和java中的说法比较类似,不进行保持处理。 这种方式适合于ios5之后的arc内存管理方式。如果是mrc内存管理方式,需要在ASIHTTPRequest对象之前使用_block关健字。

三.对于post的异步方式,和get类似,我就不多说了。 可以参照 上篇文章中的同步方式的写法,稍微变动下即可。

时间: 2025-01-06 08:01:43

ASIHTTPRequest框架使用总结系列之阿堂教程3(异步请求)的相关文章

ASIHTTPRequest框架使用总结系列之阿堂教程4(下载数据)

从本篇开始,阿堂准备进一步介绍ASIHTTPRequest框架下载数据和上传数据的实际应用. 为了实现多线程并发请求网络能力,ASIHTTPRequest被设计成 NSOperation的子类.ASINetworkQueue被设计成NSOpertaionQueue的子类.如果NSOpertaionQueue是线程管理器,NSOperation就相当于一个线程.它们被添加到NSOperationQueue队列中有序执行.ASINetworkQueue 和ASIHTTPRequest也有同样的概念,

ASIHTTPRequest框架使用总结系列之阿堂教程2(同步请求)

从本篇开始,阿堂结合一些具体代码来说明.在ASIHTTPRequest框架中,与http请求相关的类有ASIHTTPRequest  和 ASIFormDataRequest,其中最常用的是 ASIHTTPRequest ,ASIFormDataRequest 是ASIHTTPRequest  的子类,可以发送html类似的表单数据,也可以上传数据,默认采用其它httpy请求方式.它们都可以进行异步或同步请求. 从性能和用户体验来说,阿堂是不建议用同步方式的,建议用异步方式.就是说在主线程中一般

Angular系列---- AngularJS入门教程03:AngularJS 模板(转载)

是时候给这些网页来点动态特性了——用AngularJS!我们这里为后面要加入的控制器添加了一个测试. 一个应用的代码架构有很多种.对于AngularJS应用,我们鼓励使用模型-视图-控制器(MVC)模式解耦代码和分离关注点.考虑到这一点,我们用AngularJS来为我们的应用添加一些模型.视图和控制器. 请重置工作目录: git checkout -f step-2 我们的应用现在有了一个包含三部手机的列表. 步骤1和步骤2之间最重要的不同在下面列出.,你可以到GitHub去看完整的差别. 视图

Angular系列----AngularJS入门教程01:AngularJS模板 (转载)

是时候给这些网页来点动态特性了——用AngularJS!我们这里为后面要加入的控制器添加了一个测试. 一个应用的代码架构有很多种.对于AngularJS应用,我们鼓励使用模型-视图-控制器(MVC)模式解耦代码和分离关注点.考虑到这一点,我们用AngularJS来为我们的应用添加一些模型.视图和控制器. 请重置工作目录: git checkout -f step-2 我们的应用现在有了一个包含三部手机的列表. 步骤1和步骤2之间最重要的不同在下面列出.,你可以到GitHub去看完整的差别. 视图

Angular系列------AngularJS入门教程:导言和准备(转载)

学习AngularJS的一个好方法是逐步完成本教程,它将引导您构建一个完整的AngularJS web应用程序. 该web应用是一个Android设备清单的目录列表,您可以筛选列表以便查看您感兴趣的设备,然后查看设备的详细信息. 本教程将向您展示AngularJS怎样使得web应用更智能更灵活,而且不需要各种扩展程序或插件. 通过本教程的学习,您将: 阅读示例学习怎样使用AngularJS的客户端数据绑定和依赖注入功能来建立可立即响应用户操作的动态数据视图. 学习如何使用AngularJS创建数

玩转Google开源C++单元测试框架Google Test系列(gtest)之一 初识gtest

进入文件夹执行: ./configure make make install 完毕即可正常使用: (1)包含include目录 -I/root/scp/gtest/gtest-1.3.0: (2)包含lib中的动态链接库:-lgtest -L/root/scp/gtest/gtest-1.3.0/lib 示例代码: [cpp] view plaincopy #include <gtest/gtest.h> int Foo(int a, int b) { if (a == 0 || b == 0

Angular系列----AngularJS入门教程04:迭代器过滤(转载)

我们在上一步做了很多基础性的训练,所以现在我们可以来做一些简单的事情喽.我们要加入全文检索功能(没错,这个真的非常简单!).同时,我们也会写一个端到端测试,因为一个好的端到端测试可以帮上很大忙.它监视着你的应用,并且在发生回归的时候迅速报告. 请重置工作目录: git checkout -f step-3 我们的应用现在有了一个搜索框.注意到页面上的手机列表随着用户在搜索框中的输入而变化. 步骤2和步骤3之间最重要的不同在下面列出.你可以在GitHub里看到完整的差别. 控制器 我们对控制器不做

玩转Google开源C++单元测试框架Google Test系列(转载)

越来越多公司采用敏捷开发,单元和回归测试越来越重要,GTest作为最佳C++单元测试工具越来越多的被使用.转自 http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 前段时间学习和了解了下Google的开源C++单元测试框架Google Test,简称gtest,非常的不错. 我们原来使用的是自己实现的一套单元测试框架,在使用过程中,发现越来越多使用不便之处,而这样不便之处,gtest恰恰很好的解决了. 其实gtest本身的

Angular系列----AngularJS入门教程00:引导程序(转载)

我们现在开始准备编写AngularJS应用——phonecat.这一步骤(步骤0),您将会熟悉重要的源代码文件,学习启动包含AngularJS种子项目的开发环境,并在浏览器端运行应用. 进入angular-phonecat目录,运行如下命令: git checkout -f step-0 该命令将重置phonecat项目的工作目录,建议您在每一学习步骤运行此命令,将命令中的数字改成您学习步骤对应的数字,该命令将清除您在工作目录内做的任何更改. 运行以下命令: node scripts/web-s