• ios GCD ---- (1)


    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(@"只执行一次线程");
        });
      //通常应用于创建单例 保证线程安全
  • 相关阅读:
    LoadRunner系统资源监视
    Loadrunner web_url函数学习(转贴)
    Chrome的开发者工具(Chrome Developer Tools)
    浏览器对同一域名进行请求的最大并发连接数(转贴)
    转贴---Performance Counter(包含最全的Windows计数器解释)
    去掉html代码中多余琐碎的标签
    你永远不知道什么地方有笔误
    office2016开发者选项在哪?
    [VBA]检测一个中文字符串是否包含在另一个字符串中
    电子发票怎么开
  • 原文地址:https://www.cnblogs.com/azhen/p/7416677.html
Copyright © 2020-2023  润新知