iOS开发之:dispatch_async 与 dispatch_get_global_queue 的使用方法

转载 2016年05月30日 14:46:05

iOS开发之:dispatch_async 与 dispatch_get_global_queue 的使用方法 


正文开始

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

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

GCD相对来说是一种更优雅的方式,看如下代码:

NSString* parameter = [self getSomeParameter];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    NSString* result = [self fetchResultFromWebWithParameter:parameter];

    dispatch_async(dispatch_get_main_queue(), ^{

        [self updateUIWithResult:result];

    });

});


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

^{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线程。

IOS异步获取数据并刷新界面dispatch_async的使用方法

在ios的开发和学习中多线程编程是必须会遇到并用到的。 在java中以及Android开发中,大量的后台运行,异步消息队列,基本都是运用了多线程来实现。  同样在,在ios移动开发和Android...
  • qinlicang
  • qinlicang
  • 2014年12月28日 22:48
  • 87002

dispatch_sync和dispatch_async

dispatch_async和dispatch_sync方法需要传2个参数,第一个参数是队列类型,第二个参数是block块。 dispatch_sync:同步当前调用此gcd的线程,会阻塞当前调用g...
  • a330416020
  • a330416020
  • 2015年06月01日 16:15
  • 4718

iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用

介绍:Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统。这建立在任务并行执行的线程池模式的基础上的。它首次...
  • totogo2010
  • totogo2010
  • 2012年09月25日 16:22
  • 143927

dispatch_async 和 dispatch_sync 的区别

dispatch_sync(),同步添加操作。他是等待添加进队列里面的操作完成之后再继续执行。 dispatch_queue_t concurrentQueue = dispatch_q...
  • zhangping871
  • zhangping871
  • 2015年03月06日 13:56
  • 4313

dispatch_async_f 详解

之前面试的时候被问过一个问题:你知道dispatch_async_f 吗?我一脸蒙比,问题好变态,太偏了吧,见过但是没用过,不知道干啥的。。今天一时兴起,想了解一下,下面是参数的官方文档: conte...
  • gaoyuqiang30
  • gaoyuqiang30
  • 2017年03月01日 13:03
  • 729

完整详解GCD系列(一)dispatch_async;dispatch_sync;dispatch_async_f;dispatch_sync_f

为什么要写这个系列,因为百度了一下,找了很多都是些片面的Blog,拷贝来拷贝去的,写的也很粗糙。没有一个完整的可参考系列 所以,我要写这个系列,尽量把官网文档中GCD的强大功能完整的表达出来。方便自己...
  • Hello_Hwc
  • Hello_Hwc
  • 2014年11月13日 08:28
  • 17935

ios dispatch_async使用

一般这样使用: dispatch_async(dispatch_get_global_queue(0, 0),^{ //进入另一个线程 dispat...
  • marujunyy
  • marujunyy
  • 2013年01月30日 09:55
  • 3410

dispatch_barrier_async和dispatch_barrier_sync的使用

首先,barrier的直译是障碍,栅栏和分界线的意思! 所以可以很直观的想到这个使用与在GCD中设置障碍用的! 例如,要之前三部分任务,第二部分要在第一部分之后才执行,第三部分要在第二部分之后才执...
  • willluckysmile
  • willluckysmile
  • 2017年03月10日 12:51
  • 684

dispatch_sync与dispatch_async

dispatch_sync(dispatch_get_main_queue(), ^(){ NSLog(@”222”); }); 在iOS中是无法使用 dispatch_...
  • Soccer_ZZM
  • Soccer_ZZM
  • 2017年05月04日 11:42
  • 172

dispatch_sync和dispatch_async的区别

dispatch_sync(dispatch_get_main_queue(), ^(){         NSLog(@"222");     }); 在ios中是无法使用 dispatch_...
  • baidu_23493547
  • baidu_23493547
  • 2016年01月15日 22:10
  • 1519
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS开发之:dispatch_async 与 dispatch_get_global_queue 的使用方法
举报原因:
原因补充:

(最多只允许输入30个字)