ASIHTTPRequest框架使用总结系列之阿堂教程3(异步请求)
在上一节中,阿堂和网友们分享了ASIHTTPRequest框架对于get,post的同步请求方式。很显然,如果网速比较慢,查询的时候会一直很黑屏,直到请求结束界面才出现结果,这样用户体验肯定很不好了。正如上节阿堂所说,同步请求一般只是在某个子线程中使用,而不在主线程中使用。
-(void)startRequest
{
NSString *strURL = [[NSString alloc]initWithFormat:@"http://www.crazyit.com/service/mynotes/webservice.php?email=%@&type=%@&action=%@",@"heyitang@qq.com",@"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=%@",@"heyitang@qq.com",@"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类似,我就不多说了。 可以参照 上篇文章中的同步方式的写法,稍微变动下即可。
ASIHTTPRequest框架使用总结系列之阿堂教程3(异步请求)的更多相关文章
- ASIHTTPRequest框架使用总结系列之阿堂教程1(安装配置篇
在前年,阿堂在<IOS开发系列之阿堂教程:玩转IPhone客户端和Web服务端交互(客户端)实践>一文中,对于ASIHTTPRequest框架有过一些介简单绍,具体链接地址见http:// ...
- ASIHTTPRequest框架使用总结系列之阿堂教程5(上传数据)
在上篇文章中,阿堂和网友们分享了如何用ASIHTTPRequest框架下载数据的实例,本篇阿堂将数据介绍如何用ASIHTTPRequest框架上传数据的应用实例. 数据上传是通过ASIHT ...
- ASIHTTPRequest框架使用总结系列之阿堂教程4(下载数据)
从本篇开始,阿堂准备进一步介绍ASIHTTPRequest框架下载数据和上传数据的实际应用. 为了实现多线程并发请求网络能力,ASIHTTPRequest被设计成 NSOperation ...
- ASIHTTPRequest框架使用总结系列之阿堂教程2(同步请求)
从本篇开始,阿堂结合一些具体代码来说明.在ASIHTTPRequest框架中,与http请求相关的类有ASIHTTPRequest 和 ASIFormDataRequest,其中最常用的是 ASIH ...
- ASIHTTPRequest系列(一):同步和异步请求
ASIHTTPRequest系列(一):同步和异步请求 发表于8个月前(2013-11-27 19:21) 阅读(431) | 评论(0) 6人收藏此文章, 我要收藏 赞0 ASIHTTPRequ ...
- IOS开发系列之阿堂教程:玩转IPhone客户端和Web服务端交互(客户端)实践
说到ios的应用开发,我们不能不提到web server服务端,如果没有服务端的支持,ios应用开发就没有多大意义了,因为从事过手机开发的朋友都知道(Android也一样),大量复杂业务的处理和数据库 ...
- IT兄弟连 JavaWeb教程 创建异步请求对象
异步请求对象:XMLHttpRequest对象,通过该对象向服务器发送异步请求.它是异步请求的技术,所有的现代浏览器(IE7+.FireFox.Chrome.Safari以及Opera)都支持,老版本 ...
- Java多线程开发系列之五:Springboot 中异步请求方法的使用
Springboot 中异步线程的使用在过往的后台开发中,我们往往使用java自带的线程或线程池,来进行异步的调用.这对于效果来说没什么,甚至可以让开发人员对底层的状况更清晰,但是对于代码的易读性和可 ...
- [转载]IOS项目打包除去NSLog和NSAssert处理之阿堂教程
原文链接地址:http://blog.sina.com.cn/s/blog_81136c2d0102v1ck.html 原文地址:IOS项目打包除去NSLog和NSAssert处理之阿堂教程作者:时空 ...
随机推荐
- Mysql 查询—按位运算
前言:虽说这是件小事儿,但本宝宝思前想后,还是为它留下一笔,嘿嘿.反正写博客不浪费纸和笔!好久没有开启我的逗比模式了,我亲爱的乖徒弟DBA,DBB,DBAA等,好久不见你们,遥祝幸福快乐+DB. 整个 ...
- [洛谷P2801]教主的魔法
题目大意:有$n$个数,$q$个操作.两种操作: $M\;l\;r\;w:$把$[l,r]$所有数加上$w$ $A\;l\;r\;c:$查询$[l,r]$内大于等于$c$的元素的个数. 题解:分块,对 ...
- ccpc 网络赛 hdu 6155
# ccpc 网络赛 hdu 6155(矩阵乘法 + 线段树) 题意: 给出 01 串,要么询问某个区间内不同的 01 子序列数量,要么把区间翻转. 叉姐的题解: 先考虑怎么算 \(s_1, s_2, ...
- cf 834 E. Ever-Hungry Krakozyabra
cf 834 E. Ever-Hungry Krakozyabra(爆搜+数位dp) 题意: 定义一种inedible tail为一个数把每一位数字按不降的顺序排列后,去掉前导0组成的序列 比如570 ...
- JAVA File方法各类文件复制操作
import java.io.*; public class AllFile { public static void main(String[] args) throws Exception {// ...
- 熊猫(i)
题目描述 熊猫喜欢吃数,熊猫对与每个数都有他独特的评价.具体来说,熊猫对数 xx 的评价是个四元组 (a, b, c, d)(a,b,c,d),计算方式如下: 首先将 xx 写成二进制形式(不含前导零 ...
- Pty的字符串(string)
题目描述 在神秘的东方有一棵奇葩的树,它有一个固定的根节点(编号为1).树的每条边上都是一个字符,字符为a,b,c中的一个,你可以从树上的任意一个点出发,然后沿着远离根的边往下行走,在任意一个节点停止 ...
- Python设置函数调用超时
http://blog.sina.com.cn/s/blog_63041bb80102uy5o.html 背景: 最近写的Python代码不知为何,总是执行到一半卡住不动,为了使程序能够 ...
- HDU5974 A Simple Math Problem---数论--转化解方程
感谢:http://blog.csdn.net/mirror58229/article/details/63685884 题意:x+y=a lcm(x,y)=b 求x,y 12WCases + b ...
- QLineEdit使用总结(转)
本文转自 https://www.cnblogs.com/hellovenus/p/5183593.html