ios GCD ---- (1)

  1. 云栖社区>
  2. 博客>
  3. 正文

ios GCD ---- (1)

晚睡的阿振 2017-08-23 09:56:00 浏览755
展开阅读全文

GCD

Grand Central Dispatch (GCD)  字面意思 宏大的中央调度器  反正就是很牛逼吧 

在 gcd 中并不叫多线程开发,因为开发者并不涉及线程的开启和关闭以及调度. 只是操作任务在队列中, 所有关于线程的事都是有 GCD 帮我们去做的;

线程的开启线程的以及操作都是通过 GCD 完成的 所以开发者并不牵扯到线程的调度;只是调度的任务.具体开多少线程  什么时候开都有系统自己去操作

主队列 & 串行队列的区别?

  一个一个安排任务,队列特点:FIFO

 

  -并发队列:可以调度多个任务

    -串行队列:必须等待一个任务执行完成,再调度另外一个任务。最多只能开启一个线程。

  -主队列:以FIFO调度任务,如果主线程删共有任何任务在执行,主队列就不会调度任务,主要负责在主线程上执行任务!

 

 

全局队列

/*
     
     ios 7 
     DISPATCH_QUEUE_PRIORITY_HIGH 2  高优先级
     DISPATCH_QUEUE_PRIORITY_DEFAULT 0 默认优先级
     DISPATCH_QUEUE_PRIORITY_LOW (-2) 低优先级
     DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 非常低 基本忽略
     ios 8 用户体验度
     
     *  - QOS_CLASS_USER_INTERACTIVE 用户交互
     *  - QOS_CLASS_USER_INITIATED   用户使用
     *  - QOS_CLASS_DEFAULT          默认使用
     *  - QOS_CLASS_UTILITY          使用工具
     *  - QOS_CLASS_BACKGROUND       后台使用
     
     预留参数
     */
    
    dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0), ^{
        NSLog(@"异步");
    });

并发异步

/**
 并发异步 开启异步线程 执行顺序 无序
 第一个参数: 线程标识符
 第二个参数:
DISPATCH_QUEUE_CONCURRENT 并发队列
  
*/ dispatch_queue_t q = dispatch_queue_create(queueName, DISPATCH_QUEUE_CONCURRENT); for (int i = 0; i < 100 ; i ++ ) { dispatch_async(q, ^{ NSLog(@"%zd, ----- %zd",i ,[NSThread isMainThread]); }); }

并发同步

/**
     并发同步 不开启线程 按顺序执行
     1 线程标识符
     2 线程状态, DISPATCH_QUEUE_CONCURRENT 并发队列
     */
    dispatch_queue_t q = dispatch_queue_create(queueName, DISPATCH_QUEUE_CONCURRENT);

    for (int i = 0; i < 100 ; i ++ ) {
        dispatch_sync(q, ^{
            NSLog(@"%zd, ----- %zd",i ,[NSThread isMainThread]);
        });
    }

串行同步

/**
     串行同步 不开启线程 按顺序执行
     
     */
    dispatch_queue_t q = dispatch_queue_create(queueName, DISPATCH_QUEUE_SERIAL);
    
    for (int i = 0; i < 100 ; i ++ ) {
        dispatch_sync(q, ^{
            NSLog(@"%zd, ----- %zd",i ,[NSThread isMainThread]);
        });
    }

串行异步

/**
     串行异步 开启子线程线程 按顺序执行
     */
    dispatch_queue_t q = dispatch_queue_create(queueName, DISPATCH_QUEUE_SERIAL);
    
    for (int i = 0; i < 100 ; i ++ ) {
        dispatch_async(q, ^{
            NSLog(@"%zd, ----- %zd",i ,[NSThread isMainThread]);
        });
    }

 线程组

    //创建线程
    dispatch_queue_t q = dispatch_queue_create(queueName, DISPATCH_QUEUE_CONCURRENT);
    //创建线程组
    dispatch_group_t g = dispatch_group_create();
    
    dispatch_group_async(g, q, ^{
        
    });
        //添加任务到线程组
    dispatch_group_async(g, q, ^{
        
    });
    dispatch_group_async(g, q, ^{
        
    });
    dispatch_group_async(g, q, ^{
        
    });
    
    /**
     所有任务完成在 制定的线程通知任务完成
     */
    dispatch_group_notify(g, dispatch_get_main_queue(), ^{
        
    });

单次执行

/*
     只执行一次
     */
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSLog(@"只执行一次线程");
    });
  //通常应用于创建单例 保证线程安全

 

网友评论

登录后评论
0/500
评论
晚睡的阿振
+ 关注