本文以UIActivityIndicatorView为例,有没有同学试过调接口,调接口的时候会不会想要有个UIActivityIndicatorView去转圈圈来表示正在等待呢?但是你如果直接调接口的话,即使你用UIActivityIndicatorView ,会不会怎么也无法显示呢? 如果遇到这种情况,用GCD就可以,不过好麻烦就是了……
- (IBAction)queryUser:(id)sender { [telephoneTextField resignFirstResponder]; //开始转圈圈 [indicator setHidden:NO]; [indicator setHidesWhenStopped:YES]; [indicator startAnimating];//转圈圈 //采用GCD,如果调接口成功或者失败,圈圈停止 dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSString *telephone = telephoneTextField.text; if ([telephone length] == 0) { //执行主线程 dispatch_async(dispatch_get_main_queue(), ^{ UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"业务号码不能为空" message:@"请重新输入条件查询!" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]; [alertView show]; [alertView release]; [indicator stopAnimating];//停止圈圈 }); return; } //调用接口 UserQueryBO *userQueryBO = [[UserQueryBO alloc] init]; NSDictionary *resultList = [userQueryBO queryUser:telephone forUser:nil]; //接口返回值 NSString *returnCode = [NSString stringWithFormat:@""]; NSString *message= [NSString stringWithFormat:@""]; NSString *resultInfo= [NSString stringWithFormat:@""]; if (resultList != nil) { returnCode = [resultList objectForKey:@"ReturnCode"]; message = [resultList objectForKey:@"Message"]; resultInfo = [resultList objectForKey:@"ResultInfo"]; //NSLog(@"%@", resultInfo); } if ([returnCode isEqualToString:@"0"]) { if ([resultInfo length] > 0) { //成功调用主线程,利用主线程里navigationController去打开新页面 dispatch_async(dispatch_get_main_queue(), ^{ UserQueryShowVC *userQueryShowVC = [[UserQueryShowVC alloc] init]; userQueryShowVC.userInfo = resultInfo; [self.navigationController pushViewController:userQueryShowVC animated:YES]; self.navigationController.title = @"用户查询详情"; [userQueryShowVC release]; }); } else { //接口调用失败,利用主线程打开输入框 dispatch_async(dispatch_get_main_queue(), ^{ UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"没查询到相关用户信息" message:@"请重新输入条件查询!" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]; [alertView show]; [alertView release]; [indicator stopAnimating];//停止圈圈 }); } } else { //接口调用失败,利用主线程打开输入框 dispatch_async(dispatch_get_main_queue(), ^{ UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"查询失败" message:[@"请重新输入条件查询!失败信息:" stringByAppendingString:message] delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]; [alertView show]; [alertView release]; [indicator stopAnimating];//停止圈圈 }); } //[resultInfo release]; //[message release]; //[returnCode release]; [userQueryBO release]; //这里,保险起见,再停止圈圈…… dispatch_async(dispatch_get_main_queue(), ^{ [indicator stopAnimating]; }); }); }
代码如上,用//采用GCD
dispatch_async(dispatch_get_global_queue(0, 0), ^{});将接口逻辑放在这里,如果需要停止圈圈或者弹出对话框,则用
dispatch_async(dispatch_get_main_queue(), ^{
[indicator stopAnimating];
});
去会写数据到主线程。
记得,不这样的话会报错的说
相关推荐
iOS GCD 开发教程 完整版 有需要的同学看看 iOS GCD 开发教程 完整版 有需要的同学看看 iOS GCD 开发教程 完整版 有需要的同学看看
iOS GCD timer 计时器 自己封装直接使用即可 GCD实现的计时器解决timer内存不好管理问题。
iOS GCD详解,让你了解并掌握GCD的使用
使用GCD封装下载通用类IOS版本,能更好的管理在整个APP的下载流程。
IOS block回调代码实例Demo IOS block 回调 Demo 块
美团GCD面试题分析!这个我们熟悉又陌生的GCD,面试已经成了必问的内容!如何在面试过程中披荆斩棘,也成了我们现在iOS开发一个非常重要的话题!这一节课非常值得你来听!!!
ios自定义回调方法
iOS开发中,有两种常用的方法可以实现延迟执行,一种是使用GCD,另外一种是使用NSRunLoop类中提供的方法。 前言 对初学者来说,GCD似乎是一道迈不过去的坎,很多人在同步、异步、串行、并行和死锁这几个名词的漩涡中...
Grand Central Dispatch (GCD)是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现。...也就是说,GCD用我们难以置信的非常简洁的记述方法,实现了极为复杂的多线程编程。
iOS常见的多线程:GCD 任务和队列,异步执行 + 并发队列,线程锁,信号量
1.iOS多核任务,比NSThead更易用的异步方法 2.展示了如何停止一个GCD方法
swift写的GCD的一些小例子,有关多线程的控制、线程安全等等
iOS GCDTimer(GCD定时器) 使用GCD 封装的GCD定时器,方便使用和管理定时器的开始,暂停,停止释放 各种状态
这是一份有关IOS GCD多线程的代码,有助于理解IOS多线程的理解与掌握
ios 完美使用gcd 哪怕菜鸟都会使用的线程操作,队列,定时器,等待等
GCD详尽总结
主要介绍了iOS-GCD使用详解及实例解析的相关资料,需要的朋友可以参考下
演示了在iOS下,如何使用块回调方法来代替代理模式的效果。
dispatch_queue_t queue = dispatch_queue_create("com.gcd-dispatch_group_async(gro