GCD (Grand Central Dispatch) 是Apple公司开发的一种技术,它旨在优化多核环境中的并发操作并取代传统多线程的编程模式。 在Mac OS X 10.6和IOS 4.0之后开始支持GCD。

使用GCD的一个理由就是方便。回想一下以前的多线程编程,我们会把异步调用的代码放到另外的一个函数中,并通过NSThread开启新线程来启动这段代码。 这种跳来跳去的流程对于复杂的逻辑简直就是一场灾难。更糟糕的是,调用线程时的环境对异步代码是不可见的,如果我们需要当时的临时变量的话只有两个选择: 保存到类成员变量中或者作为参数传递过去。前者会造成很多莫名奇妙的无关类成员,而后者的功能过于有限。

-(void) referCurrencyRate:(UIButton *)btn{

activity.hidden=NO;

[activity startAnimating];

// may be get param

//

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

//do lost large time works

NSString *rate=  [NetConnect GetCurrentcyRateTester:@""];

dispatch_async(dispatch_get_main_queue(), ^{

//继续UI 更新等

UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"提示"

message:rate

delegate:nil

cancelButtonTitle:@"确定"

otherButtonTitles:nil];

[alert show];

[activity stopAnimating];

[activity setHidesWhenStopped:YES];

});

});

// [NSTimer scheduledTimerWithTimeInterval:5.5 target:self selector:@selector(hid) userInfo:nil repeats:NO];

}

在上面的代码中,出现了一种奇怪的格式:

^{code...}

解释一下,当一段代码被花括号包裹并在开头放置上尖号时,我们称之为块(block)。如果你学过C语言的话(实际上,block正是apple对C的一个扩展), 你可以认为这是一个增强型的函数指针。它不仅可以当做一个变量来回传递,还可以引用本身环境之外的变量(如上面代码中的parameter)。 更进一步地说,它是apple的C扩展中闭包的实现。在block里引用的对象会自动被retain,因此你也不必担心内存的问题。

另外涉及到了三个函数

void dispatch_async(
dispatch_queue_t queue,
dispatch_block_t block); dispatch_queue_t dispatch_get_global_queue(
long priority,
unsigned long flags); dispatch_get_main_queue();

dispatch_async 函数会将传入的block块放入指定的queue里运行。这个函数是异步的,这就意味着它会立即返回而不管block是否运行结束。因此,我们可以在block里运行各种耗时的操作(如网络请求) 而同时不会阻塞UI线程。 
dispatch_get_global_queue 会获取一个全局队列,我们姑且理解为系统为我们开启的一些全局线程。我们用priority指定队列的优先级,而flag作为保留字段备用(一般为0)。 
dispatch_get_main_queue 会返回主队列,也就是UI队列。它一般用于在其它队列中异步完成了一些工作后,需要在UI队列中更新界面(比如上面代码中的[self updateUIWithResult:result])的情况。

好的,知道这些特性之后,我们可以这样理解上面的代码:利用parameter变量异步地发起一个网络请求,并在请求之后更新UI线程。

这种需求很常见,诸如页面数据刷新等,基本IOSAPP这种展示的类的东西,这种用法常见。之前,我做指示器的使用都是定时器,现在都改成这种了。

定时器也可以实现这种方法,但是这不是定时器该做的事。

最新文章

  1. react+redux教程(六)redux服务端渲染流程
  2. git常见错误
  3. Jenkins + GitHub + fir-cli 一行命令从源码到fir.im
  4. 18数据表&E-R模型&概念数据模型-下(选学)-天轰穿大话数据库视频教程
  5. MyEclipse xml 手动添加 dtd
  6. hdu 3987 Harry Potter and the Forbidden Forest 求割边最少的最小割
  7. C#局域网桌面共享软件制作(二)
  8. 【BZOJ】【1532】【POI2005】Kos-Dicing
  9. oracle批量导入数据
  10. C# Directory类
  11. U菜1G变化8M该解决方案
  12. Spring(二)--FactoryBean、bean的后置处理器、数据库连接池、引用外部文件、使用注解配置bean等
  13. CentOS 7 更改网卡名为eth0
  14. redi集群测试
  15. Unity API 解析 (陈泉宏著)
  16. 【zookeeper】使用场景
  17. Codeforces Beta Round #12 (Div 2 Only)
  18. HBase数据结构(读书笔记 )
  19. Mac下基于testrpc和truffle的以太坊智能合约开发环境搭建
  20. Razor:从aspx到cshtml常见错误及正确书写方法

热门文章

  1. WAS:服务器停电后,重启DMGR,控制台访问不了
  2. 黑客技术 —— Linux 命令行
  3. ubuntu中使用apt-get安装zbar
  4. BZOJ_1224_[HNOI2002]彩票_爆搜+打表
  5. maven(二)创建一个maven的web项目中解决Cannot change version of project facet Dynamic web module to 2.5
  6. CoreOS,CoreOS,一款 Linux 容器发行版
  7. 【旧文章搬运】更正一个枚举PspCidTable时的错误
  8. POI2013 Bytecomputer
  9. EOJ3263:丽娃河的狼人传说(贪心)
  10. PTA 模拟,【放着一定要写哈哈哈哈哈】(据说用string哟)