GCD dispatch使用浅析

原创 2015年11月19日 20:47:37

延后执行任务

// 定义延后执行的秒
int64_t delayInSeconds = 5;
// 根据延后执行的秒数获取纳秒
dispatch_time_t *popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(),^(void){
    // 这里是你要延后执行的任务
})

同步和异步(dispatch_asycn和dispatch_sync)

dispatch_asycn和dispatch_sync是GCD的两种队列执行方式

异步执行 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
param block  异步执行的任务
param queue  执行任务的队列


// 获取全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 异步执行,执行结果有abc,acb,cab三种
dispatch_async(queue, ^{
    NSLog(@"a");
    NSLog(@"b");
});
NSLog(@"c");

获取全局队列,将dispatch_async的block里面的任务丢到另一个子线程中去执行,而且是立即执行,
不会发生阻塞,执行结果就会有三种,如果换成同步执行

同步执行 dispatch_sync(dispatch_queue_t queue, ^(void)block)
param block  同步执行的任务
param queue  执行任务的队列

// 获取全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 同步执行,执行结果只有abc
dispatch_sync(queue, ^{
    NSLog(@"a");
    NSLog(@"b");
});
NSLog(@"c");

先获取全局队列,这次是dispatch_sync的block里面的任务会先执行,子线程执行完之后,主线程才会执行
如果将全局队列换成主队列,

// 获取主队列
dispatch_queue_t queue = dispatch_get_main_queue();
// 同步执行,会发生死锁
dispatch_sync(queue, ^{
    NSLog(@"a");
    NSLog(@"b");
});
NSLog(@"c");

dispatch_sync把block里面的任务,交给主线程同步执行,主线程要等block里面的任务执行完毕才能执行自身任务,
而队列是先进先出的,dispatch_sync的block里面的任务是后进的,所以它也在等待主线程自身任务执行完毕在执行
自己的任务,所以就造成了死锁,所以要将任务添加到主队列的时候,要使用dispatch_async添加,异步执行

手动创建队列

有时候我们需要手动创建并行或者串行队列而不是获取主线程队列或者全局队列,幸运的是,苹果官方API种给出了这样的方法

dispatch_queue_t myQueue = dispatch_create();
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/top_roboo/article/details/49933573

GCD高级用法-Dispatch I/O

在读取较大文件时,如果将文件分成合适的大小并使用Global Dispatch Queue 并发读取的话,应该会比一般的读取速度快不少。现在的输入/输出硬件已经可以做到一次使用多个线程更快地并发读取了...
  • u014205965
  • u014205965
  • 2015-05-22 23:16:39
  • 1451

GCD学习笔记(三):Main Dispatch Queue/Global Dispatch Queue

http://itjoy.org/?p=551     上节笔记中介绍了如何创建queue,通过dispatch_queue_create() 函数得到我们想要的queue,其实不用...
  • leonpengweicn
  • leonpengweicn
  • 2015-06-10 12:46:14
  • 779

GCD dispatch source

根据苹果的官方文档,dispatch source是基础数据类型,协调特定底层系统事件的处理,用于监听一些特定类型的事件对象,接收到事件发生时,自动将一个block压入一个线程。配置一个dispatc...
  • pingshw
  • pingshw
  • 2013-11-25 17:40:35
  • 2804

iOS开发中利用dispatch group实现并发多任务

现在有一个需求:某个页面中的数据是通过三个接口给出的,现在需要三个接口中的数据全部返回后再一起展示全部数据。 需求分析:1.我们要将三个网络请求放在新开辟的子线程。 2.为了提高效率要将三个网络请求采...
  • u010105969
  • u010105969
  • 2017-04-08 15:05:59
  • 1388

关于GCD 延时操作 简单理解 (dispatch_asycn,dispatch_sycn)

同步(sync) 和 异步(async) 的主要区别在于会不会阻塞当前线程,直到 Block 中的任务执行完毕! 如果是 同步(sync) 操作,它会阻塞当前线程并等待 Block 中的任...
  • u011864662
  • u011864662
  • 2016-08-26 13:41:02
  • 845

通过GCD中的dispatch_barrier_(a)sync加强对sync中所谓等待的理解

首先解释下标题里地括号是什么意思,GCD有个函数叫dispatch_barrier_async,还有个函数叫dispatch_barrier_sync,这个括号只是用来防止标题取得太长…>_...
  • u013046795
  • u013046795
  • 2015-07-25 16:28:20
  • 9590

iOS_GCD_讲解三_Dispatch Sources

转载出处:http://www.dreamingwish.com/dream-2012/gcd%E4%BB%8B%E7%BB%8D%EF%BC%88%E4%B8%89%EF%BC%89-dispatc...
  • tianjf0514
  • tianjf0514
  • 2014-01-23 20:58:40
  • 7862

GCD介绍: 基本概念和Dispatch Queue

iOS的三种多线程技术                     1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技...
  • crycheng
  • crycheng
  • 2014-03-26 21:45:26
  • 30387

GCD基本概念

  • 2015年08月13日 17:40
  • 551KB
  • 下载

GCD 信号量控制并发 (dispatch_semaphore)

当我们在处理一系列线程的时候,当数量达到一定量,在以前我们可能会选择使用NSOperationQueue来处理并发控制,但如何在GCD中快速的控制并发呢?答案就是dispatch_semaphore,...
  • fhbystudy
  • fhbystudy
  • 2014-05-15 21:58:01
  • 33532
收藏助手
不良信息举报
您举报文章:GCD dispatch使用浅析
举报原因:
原因补充:

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