GCD

并发
很多人同时排队买火车票
并行
火车站有5个窗口同时卖票

dispatch_set_target_queue

变更生成的Dispatch Queue的执行优先级
dispatch_set_target_queue(queue1,queue2);
queue1:指定要变更优先级的queue
queue2:指定queue1与queue2使用相同优先级
第一个参数如果指定为系统提供的 Main Dispatch Queue 则不知道会发生什么。因此不可指定。
如果在多个 Serial Dispatch Queue 中用dispatch_set_target_queue函数指定目标为某一 Serial Dispatch Queue,那么原本应并行执行的多个 Serial Dispatch Queue 同时只能执行一个

dispatch_after

3秒后执行

dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3ull*NSEC_PER_SEC); // 3秒
//dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3ull*NSEC_PER_MSEC); // 3毫秒
dispatch_after(time, dispatch_get_main_queue(), ^{
        
});

Dispatch Group

dispatch_barrier_async

dispatch_sync

dispatch_apply

按指定的次数将指定的block追加到指定的 Dispatch Queue 中,并等全部处理执行结束。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(10, queue, ^(size_t index) {
   NSLog(@"%zu",index);
});
NSLog(@"done");

0
2
1
4
5
6
7
8
9
3
done

dispatch_suspend / dispatch_resume

挂起指定的 Dispatch Queue
dispatch_suspend(queue);
恢复指定的 Dispatch Queue
dispatch_resume(queue);
这两个方法对已经执行的处理没有影响。挂起后,追加到 Dispatch Queue 中但尚未执行的处理会被挂起,

Dispatch Semaphore

Dispatch Semaphore 是持有计数的信号,该计数是多线程编程中的计数类型信号。所谓信号,类似于过马路时常用的手旗,可以通过时举起手旗,不可通过时放下手旗。而在 Dispatch Semaphore中,使用计数来实现该功能。计数为0时等待,计数为1或大于1时,减去1而不等待。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
/*
 * Dispatch Semaphore 的计数初始值设定为 1
 * 保证访问 NSMutableArray 类对象的线程同时只有一个
 */
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
NSMutableArray *array = [[NSMutableArray alloc] init];
for (int i=0; i<10; ++i) {
   dispatch_async(queue, ^{
       /*
        * 等待 Dispatch Semaphore
        * 一直等待,直到 Dispatch Semaphore 的计数值达到大于等于1
        */
       dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
       
       /*
        * 由于semaphore的初始值为1,达到dispatch_semaphore_wait的执行条件
        * 将semaphore的计数减一  semaphore计数=0
        */
       [array addObject:[NSNumber numberWithInt:i]];
       
       /*
        * 排他控制处理结束
        * 将semaphore计数加一  semaphore计数=1
        * 达到dispatch_semaphore_wait的执行条件
        * 由最先等待的线程执行
        */
       dispatch_semaphore_signal(semaphore);
   });
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Dispatch Queue 首先回顾一下苹果GCD的说明 开发者要做的只是定义想执行的任务并追加到适当的Disp...
    面试小集阅读 1,546评论 0 4
  • 最近颇花了一番功夫把多线程GCD人的一些用法总结出来,一来帮自己巩固一下知识、二来希望能帮到对这一块还迷茫...
    人活一世阅读 300评论 1 1
  • Grand Central Dispatch(GCD)概要 我的博客链接 什么是GCD? 苹果官方这么描述的:Gr...
    换个名字再说阅读 1,307评论 4 7
  • 章节目录 什么是GCD? 如何在多条路径中执行CPU命令列? 即使多线程存在很多问题(如数据竞争、死锁、线程过多消...
    DrunkenMouse阅读 889评论 1 13
  • 相互亲吻过这3个地方,才能叫做真爱 曾经,把朝朝暮暮当作天长地久,把缱绻一时当作爱了一世,于是奢望执子之手,幸福终...
    竹山热点阅读 7,020评论 0 2