1.dispatch_queue_create  创建队列开启异步线程(1,4,2,3)

  // 创建一个队列
dispatch_queue_t queue = dispatch_queue_create("my.test.queue", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"");
// 开启一个异步线程
dispatch_async(queue, ^{
NSLog(@"");
// 线程等待10秒
[NSThread sleepForTimeInterval:];
NSLog(@"");
}); NSLog(@"");

2.创建队列开启同步线程(1,2,3,4)

    // 创建一个队列
dispatch_queue_t queue = dispatch_queue_create("my.test.queue", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"");
// 开启一个同步线程
dispatch_sync(queue, ^{
NSLog(@"");
// 线程等待10秒
[NSThread sleepForTimeInterval:];
NSLog(@"");
}); NSLog(@"");

3.dispatch_get_global_queue 获取全局队列开启异步线程(1,4,2,3)

    NSLog(@"");
// 获取全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
// 开启一个异步线程
dispatch_async(queue, ^{
NSLog(@"");
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
NSLog(@"");

4.获取全局队列开启同步线程 (1,2,3,4)

    NSLog(@"");
// 获取全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
// 开启一个同步线程
dispatch_sync(queue, ^{
NSLog(@"");
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
NSLog(@"");

5.dispatch_get_main_queue()  获取主线程队列,再开启异步线程(1,4,2,3)

    NSLog(@"");
// 获取主线程队列
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(queue, ^{
NSLog(@"");
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
NSLog(@"");

6.获取主线程队列,再开启同步线程 (1) 。 线程会因为死锁,而永远卡死

    NSLog(@"");
// 获取主线程队列
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
NSLog(@"");
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
NSLog(@"");

总结:获取全局队列的名字是默认的,创建队列时可以自己命名队列的名字,其他用法都是一样的。个人认为同步线程意义不大

7.dispatch_get_main_queue()  回到主线程
    耗时操作需需要放在异步线程里,UI界面更新必须放在主界面里
    [2376:131819] 1111
    [2376:131819] 4444
    [2376:131860] 2222
    [2376:131860] 3333
    [2376:131819] 5555
    从打印结果来看(1,4,5是在主线程里面,2,3是在异步线程里面)

    NSLog(@"");
// 获取主线程队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
dispatch_async(queue, ^{
NSLog(@"");
[NSThread sleepForTimeInterval:];
// 回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"");
});
NSLog(@"");
});
NSLog(@"");

8.dispatch_apply  执行某个片段N(6)次

    dispatch_apply(, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^(size_t index) {
NSLog(@"");
});

9.dispatch_barrier_async 是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行 (2,1,3,4)

    dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
dispatch_barrier_async(queue, ^{
NSLog(@"333_barrier");
[NSThread sleepForTimeInterval:];
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:];
NSLog(@"");
});

10.dispatch_group_async 可以实现监听几组任务是否完成,完成后使用 dispatch_group_notify 执行其他的操作 (1,2,3,4)

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
// 创建一组任务
dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
// 监听所有组的任务完成之后执行,一般是回到主线程刷新UI界面
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"");
});

11.dispatch_once 对于某个任务执行一次,且只执行一次。 dispatch_once函数有两个参数,第一个参数predicate用来保证执行一次,第二个参数是要执行一次的任务block。

static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
// some one-time task
});

暂时用到这么多,以后再用到会继续补充,也欢迎大家指出遗漏!

队列 和 线程 之GCD dispatch的更多相关文章

  1. iOS 并行编程:GCD Dispatch Sources

    1 简介 dispatch source是一种用于处理事件的数据类型,这些被处理的事件为操作系统中的底层级别.Grand Central Dispatch(GCD)支持如下的dispatch sour ...

  2. 拆开Ceph看队列和线程

    作者:吴香伟 发表于 2017/01/08 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 我上小学时家离学校很远,家在某某山脚,学校在镇里.每周回家一趟,周五放 ...

  3. Android系统--输入系统(十七)Dispatcher线程_分发dispatch

    Android系统--输入系统(十七)Dispatcher线程_分发dispatch 1. 回顾 InputRead线程从输入设备当中得到输入事件 对于读到输入事件稍作处理,比如紧急事件,来电时候按下 ...

  4. 10.9 android输入系统_APP跟输入系统建立联系和Dispatcher线程_分发dispatch

    12. 输入系统_APP跟输入系统建立联系_InputChannel和Connection核心: socketpair // 第9课第3节_输入系统_必备Linux编程知识_任意进程双向通信(scok ...

  5. 自定义ThreadPoolExecutor带Queue缓冲队列的线程池 + JMeter模拟并发下单请求

    .原文:https://blog.csdn.net/u011677147/article/details/80271174 拓展: https://github.com/jwpttcg66/GameT ...

  6. python队列、线程、进程、协程

    目录: 一.queue 二.线程 基本使用 线程锁 自定义线程池 生产者消费者模型(队列) 三.进程 基本使用 进程锁 进程数据共享 默认数据不共享 queues array Manager.dict ...

  7. 6、TensorFlow基础(四)队列和线程

    队列和线程 和 TensorFlow 中的其他组件一样,队列(queue)本身也是图中的一个节点,是一种有状态的节点,其他节点,如入队节点(enqueue)和出队节点(dequeue),可以修改它的内 ...

  8. python队列、线程、进程、协程(转)

    原文地址: http://www.cnblogs.com/wangqiaomei/p/5682669.html 一.queue 二.线程 #基本使用 #线程锁 #自定义线程池 #生产者消费者模型(队列 ...

  9. 【Java并发】并发队列与线程池

    并发队列 阻塞队列与非阻塞队 ConcurrentLinkedQueue BlockingQueue ArrayBlockingQueue LinkedBlockingQueue PriorityBl ...

随机推荐

  1. Cannot detect Web Project version. Please specify version of Web Project through Maven project property <webVersion>. E.g.: <properties> <webVersion>3.0</webVersion> </properties>

    鼠标放在问题出会出现set web project version to 3.0和set web project version to 3.1两个选项 随便选一个版本就好了

  2. creator.d.ts 的错误

    //export class PhysicsCollider{ export class PhysicsCollider extends Collider{ ==================检查代 ...

  3. ReactiveX 学习笔记(12)调度器

    Schedulers, threading and testing 本文的主题为调度器,多线程以及测试. RxJava操作符(六)Utility SubscribeOn / ObserveOn Sub ...

  4. Haskell语言学习笔记(87)Time

    安装 time $ cabal install time Installed time-1.9.1 Prelude> import Data.Time Prelude Data.Time> ...

  5. ANg-别人家的笔记

    http://blog.csdn.net/scruelt/article/details/78997697 https://github.com/fengdu78/Coursera-ML-Andrew ...

  6. RabbitMQ、Memcached、SQLAlchemy

    一.RabbitMQ 1.基础概念 rabbitMQ说白了就是一个消息队列,类似于Queue,也是生产者与消费者模型.只不过做了扩展,所不同的是Queue在内存中的消息队列,而RabbitMQ是部署在 ...

  7. HP LaserJet MFP M227-M231 scan use manual

    HP LaserJet MFP M227-M231 scan use manual By xiangrikui 2018-10-10 Start menu/Right click Settings/ ...

  8. Resize CentOS Linux hard drive partition (centos 6.3 调整LVS磁盘大小)

    查看当前磁盘信息: [root@localhost ~]# df -h 文件系统          容量  已用  可用 已用%% 挂载点/dev/mapper/VolGroup-lv_root    ...

  9. python scrapy 插入数据库的操作

    需要安装这个 pymysql 写法还是很简单的 # -*- coding: utf-8 -*- # Define your item pipelines here # # Don't forget t ...

  10. scala 下载

    http://downloads.lightbend.com/scala/2.12.3/scala-2.12.3.tgz http://confluence.jetbrains.com/display ...