重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
我们运行程序,如果网速很慢,查询的时候会一直黑屏,直到请求结束画面才出现,这样用户体验很不好。因此同步请求一般只是在某个子线 程中使用,而不在主线程中使用。异步请求的用户体验要比同步请求好,因此一般情况下异步请求用的很多。等待过程中在状态栏上会出现网络等待指示器的经典旋 转小图标,而使用ASIHTTPRequest异步请求就实现这些效果,不用自己额外编写代码。
成都创新互联是一家集网站建设,海原企业网站建设,海原品牌网站建设,网站定制,海原网站建设报价,网络营销,网络优化,海原网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
ASIHTTPRequest 和ASIFormDataRequest两个请求类都可以发送异步请求,ASIFormDataRequest继承了 ASIHTTPRequest异步请求方法,所以我们重点介绍ASIHTTPRequest的异步请求。异步请求后通过回调委托对象的方 法:requestFinished:和requestFailed:实现。修改主视图控制器MasterViewController.m的 startRequest方法如下:
- -(void)startRequest
- {
- NSString *strURL = [[NSString alloc]
- initWithFormat:
- @”http://iosbook3/mynotes/webservice.php?email=%@&type=%@&action=%@”,
- @”<你的iosbook1.com用户邮箱>”,@”JSON”,@”query”];
- NSURL *url = [NSURL URLWithString:[strURL URLEncodedString]];
- ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
- [request setDelegate:self]; ①
- [request startAsynchronous]; ②
- }
- - (void)requestFinished:(ASIHTTPRequest *)request ③
- {
- NSData *data = [request responseData];
- NSDictionary *resDict = [NSJSONSerialization
- JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
- [self reloadView:resDict];
- }
- - (void)requestFailed:(ASIHTTPRequest *)request ④
- {
- NSError *error = [request error];
- NSLog(@”%@”, [error localizedDescription]);
- }
第 ①行代码[request setDelegate:self]设置委托对象为self,然后在第②行[request startAsynchronous]发起异步请求,服务器端返回成功则回调第③行的requestFinished:方法,失败则回调第④行的 requestFailed:方法,它们的参数都是ASIHTTPRequest类型。这两个方法是默认的回调方法,我们也可以自定义回调方法。因此上面 的代码也可以改为如下形式:
- -(void)startRequest
- {
- … …
- [request setDidFinishSelector:@selector(requestSuccess:)];
- [request setDidFailSelector:@selector(requestError:)];
- [request startAsynchronous];
- }
- - (void)requestSuccess:(ASIHTTPRequest *)request
- {
- NSData *data = [request responseData];
- NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:data
- options:NSJSONReadingAllowFragments error:nil];
- [self reloadView:resDict];
- }
- - (void)requestError:(ASIHTTPRequest *)request
- {
- NSError *error = [request error];
- NSLog(@”%@”, [error localizedDescription]);
- }
通过请求对象的setDidFinishSelector:方法指定要回调成功方法,setDidFailSelector:方法指定要回调的失败方法。
在异步请求中往往为了使代码更加整洁可以使用代码块(Block),在代码块中指定回调方法。使用了代码的主视图控制器MasterViewController.m的startRequest方法如下:
- -(void)startRequest
- {
- NSString *strURL = [[NSString alloc] initWithFormat:
- @”http://iosbook3/mynotes/webservice.php?email=%@&type=%@&action=%@”,@”<你的iosbook1.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:data
- options:NSJSONReadingAllowFragments error:nil];
- [self reloadView:resDict];
- }];
- [request setFailedBlock:^{ ④
- NSError *error = [request error];
- NSLog(@”%@”, [error localizedDescription]);
- }];
- [request startAsynchronous];
- }