- (void)test1 {
    //创建一个并发队列
    //并发队列+异步任务:创建多个线程,并发执行
    dispatch_queue_t queue = dispatch_queue_create("tqh.com", DISPATCH_QUEUE_CONCURRENT);
    //一步创建一个任务,任务不会立即执行
    dispatch_async(queue, ^{
        NSLog(@"1--%@--",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"2--%@--",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"3--%@--",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"4--%@--",[NSThread currentThread]);
    });
    NSLog(@"结束");
    //number = 4, name = (null) 无序
} - (void)test2 {
    //并发队列+同步任务:不会开启新线程,在父线程中同步执行各个子线程,也就是逐一执行,并且是添加过任务后立即执行,之后才能添加下一个任务
    dispatch_queue_t queue = dispatch_queue_create("tqh.com", DISPATCH_QUEUE_CONCURRENT);
    dispatch_sync(queue, ^{
        NSLog(@"1--%@--",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"2--%@--",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"3--%@--",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"4--%@--",[NSThread currentThread]);
    });
    NSLog(@"结束");
    //number = 1, name = main 有序
} - (void)test3 {
    //串行队列+同步任务:不会开启新线程,在父线程中同步执行各个子线程,也就是逐一执行,并且是添加过任务后立即执行,之后才能添加下一个任务
    dispatch_queue_t queue = dispatch_queue_create("tqh.com", DISPATCH_QUEUE_SERIAL);
    dispatch_sync(queue, ^{
        NSLog(@"1--%@--",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"2--%@--",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"3--%@--",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"4--%@--",[NSThread currentThread]);
    });
    NSLog(@"结束");
    //number = 1, name = main 有序
} - (void)test4 {
    //串行队列+异步任务:创建新线程,但是只会创建一个新线程,所有的任务都是在这个子线程里执行,执行顺序按照添加任务 的先后顺序,并且不是立即执行,而是等整个方法
    dispatch_queue_t queue = dispatch_queue_create("tqh.com", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        NSLog(@"1--%@--",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"2--%@--",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"3--%@--",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"4--%@--",[NSThread currentThread]);
    });
    NSLog(@"结束");
    //number = 2,name = (null),创建了一个线程 有序
} - (void)test5 {
    //主队列+异步任务:不会创建新线程,所有的任务都是在这个父线程里执行,执行顺序按照添加任务 的先后顺序,并且不是立即执行,而是等整个方法结束后依次执行
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_async(queue, ^{
        NSLog(@"1--%@--",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"2--%@--",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"3--%@--",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"4--%@--",[NSThread currentThread]);
    });
    NSLog(@"结束");
    //number = 1, name = main 有序
} - (void)test6 {
    //这个会产生问题,死锁,添加任务到主队列的任务要求立即执行,但是主队列是串行队列,当前任务要求执行完当前任务在执行新添加的任务。结果就是:两个任务互相等待,产生死锁
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_sync(queue, ^{
        NSLog(@"1--%@--",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"2--%@--",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"3--%@--",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"4--%@--",[NSThread currentThread]);
    });
    NSLog(@"结束");
    //没有打印信息
} //延时执行:没有NSObject和NsTimer精确度高
- (void)test7 {
    NSLog(@"%@",[NSDate date]);
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"%@",[NSDate date]);
    });
} //一次性代码 - (void)test8 {
    for (int i = ; i < ; i ++) {
        [self onece];
    }
    //只走了第一次
} - (void)onece {
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        NSLog(@"只走一次%@",[NSThread currentThread]);
    });
    NSLog(@"----------------");
} //快速迭代,顺序不稳定 - (void)test9 {
    dispatch_apply(, dispatch_get_global_queue(, ), ^(size_t  index) {
        NSLog(@"%ld %@",index,[NSThread currentThread]);
    });
    //无序
} //队列组
- (void)test10 {
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
    // 先执行3个耗时操作
    dispatch_group_async(group, queue, ^{
        for (int i =  ; i < ; i ++) {
            NSLog(@"1--%@--",[NSThread currentThread]);
        }
    });
    
    dispatch_group_async(group, queue, ^{
        for (int i =  ; i < ; i ++) {
            NSLog(@"2--%@--",[NSThread currentThread]);
        }
    });
    dispatch_group_async(group, queue, ^{
        for (int i =  ; i < ; i ++) {
            NSLog(@"3--%@--",[NSThread currentThread]);
        }
    });
    // 等到以上任务完成后才会执行这个notify任务
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"最后执行main--%@--",[NSThread currentThread]);
    });
}

GCD使用小结的更多相关文章

  1. iOS GCD 编程小结

    一.简单介绍 1.GCD简介? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD优势 GCD是苹果公司为多核的并行运算提出的 ...

  2. ios - GCD简单小结

    首先GCD两个名词: 队列 同步异步. 队列: 任务放到队列,队列中的任务执行方式取决于执行队列中任务的方式---同步异步. 串行队列: 任务顺序执行,可以叫阻塞队列.只有前面任务完成才执行后面的. ...

  3. iOS实录:GCD使用小结(一)

    导语:在iOS中,多线程方案有四种:pthread.NSThread.NSOperation & NSOperationQueue 和 GCD,但是开发中GCD使用得最多,本文主要总结一下我使 ...

  4. GCD的小结

    同步和异步的区别 同步:在当前线程中执行 异步:在另一条线程中执行 有4个术语比较容易混淆:同步.异步.并发.串行 同步和异步决定了要不要开启新的线程 同步:在当前线程中执行任务,不具备开启新线程的能 ...

  5. swift开发多线程篇 - 多线程基础

    swift开发多线程篇 - 多线程基础 iOS 的三种多线程技术 (1)NSThread  使用NSThread对象建立一个线程非常方便 但是!要使用NSThread管理多个线程非常困难,不推荐使用 ...

  6. ios 多线程小结----- GCD篇

    //3 GCD(充分利用设备的多盒)-------------屏蔽了线程,只能看见任务 队列步骤两步,定制任务,将任务添加到队列.GCD将添加的任务,放到线程中去执行,自动执行,自动释放原则:先进先出 ...

  7. iOS中GCD的使用小结

    http://www.jianshu.com/p/ae786a4cf3b1 本篇博客共分以下几个模块来介绍GCD的相关内容: 多线程相关概念 多线程编程技术的优缺点比较? GCD中的三种队列类型 Th ...

  8. swift 基础小结01 --delegate、Optional、GCD的使用、request请求、网络加载图片并保存到沙箱、闭包以及桥接

    本文主要记录swift中delegate的使用.“?!”Optional的概念.GCD的使用.request请求.网络加载图片并保存到沙箱.闭包以及桥接. 一.delegate的使用 swift中de ...

  9. IOS开发GCD小结

    0. Brief Introduction GCD,全称Grand Central Dispath,是苹果开发的一种支持并行操作的机制.它的主要部件是一个FIFO队列和一个线程池,前者用来添加任务,后 ...

随机推荐

  1. Android开发遇到的异常及解决办法

    Android开发遇到的错误及解决方法1. Unable to resolve target 'android-7' 解决方案: 修改工程目录下的default.properties文件里的内容tar ...

  2. OSGi在淘宝内部的使用

    现在基本不怎么用了,OSGi主要的价值,在实际中体现得不太明显 比如类隔离,用更简单的自定义ClassLoader也可以实现:单机多版本服务,用的场景也很少:热部署也不是很实用 但是,基于OSGi框架 ...

  3. linux新增一块硬盘加入原有分区

    原有硬盘空间已经不足,添加一块新硬盘,并且加入到原根目录下 查看新硬盘 1 2 fdisk -l Disk /dev/sdb: 240.1 GB, 240057409536 bytes 在新硬盘上创建 ...

  4. [转]va_start和va_end使用详解

    转载地址:http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html  本文主要介绍va_start和va_end的使用及原理. ...

  5. iOS进阶学习-数据库

    一.数据库管理系统 1.SQL语言概述:SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言. 2.常见 ...

  6. RSA和DES------加密和解密类

    public class CryptogramUtil { //******************************************************************** ...

  7. sharepoint 2010 重建遇到的问题

    需要重新安装Sharepoint 2010 ,遇到问题记录下来,sharepoint中安装了热补丁和英文语言包. 卸载: 1.运行配置向导将服务器从服务场中脱离: 2.在管理中心中卸载sharepoi ...

  8. DSP28335矩阵键盘的检测

    #include "DSP2833x_Device.h"#include "DSP2833x_Examples.h"char temp;void gpio_in ...

  9. Java-包

    定义包用package关键字. 1:对类文件进行分类管理. 2:给类文件提供多层名称空间. 如果生成的包不在当前目录下,需要最好执行classpath,将包所在父目录定义到classpath变量中即可 ...

  10. “我爱淘”冲刺阶段Scrum站立会议3

    完成任务: 将搜索框的界面已经实现以及部署到整个框架中. 计划任务: 实现搜索功能,通过数据库的链接,实现用户可以查到自己需要的书籍的信息. 遇到问题: 1.数据库的操作,怎么实现查询功能: 2.Ac ...