• 多线程知识点之GCD的使用


    /*************异步函数 + 并发队列:可以同时开启多条线程***************/

    /*************同步函数 + 并发队列:不会开启新的线程***************/

    /*************异步函数 + 串行队列:会开启新的线程,但是任务是串行的,执行完一个任务,再执行下一个任务*************/

    /*************同步函数 + 串行队列:不会开启新的线程,在当前线程执行任务,任务是串行的,执行完一个任务,再执行下一个任务***/

    /******如何创建一个并发队列******/

    1.普通方式创建

    dispatch_queue_t queue = dispatch_queue_create("队列的名字", DISPATCH_QUEUE_CONCURRENT);

    2.获得全局的并发队列

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    /******如何创建一个串行队列******/

    1.普通方式创建

    dispatch_queue_t queue = dispatch_queue_create("队列的名字", DISPATCH_QUEUE_SERIAL);

    2.获得主队列(默认就是主线程)

    dispatch_queue_t queue = dispatch_get_main_queue();

    /******如何将队列加到同步函数******/

     dispatch_sync(queue, ^{

            NSLog(@"1-----%@", [NSThread currentThread]);

        });

    /******如何将队列加到异步函数******/

    dispatch_async(queue, ^{

            NSLog(@"1-----%@", [NSThread currentThread]);

        });

    /******异步函数回到主线程(线程间的通信)******/

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            1.在子线程里执行任务(比如下载图片等耗时操作在此处执行)

            2.子线程任务执行完毕回到主线程

            dispatch_async(dispatch_get_main_queue(), ^{

                self.imageView.image = image;

               3.主线程做完事情又可以回到子线程

    dispatch_async(queue, ^{

            NSLog(@"1-----%@", [NSThread currentThread]);

        });

            });

    });

    /******延时函数的使用******/

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

            NSLog(@"run-----");

     });

    /******保证某段代码在程序运行过程中只被执行一次(不能用于懒加载)******/

    static dispatch_once_t onceToken;

        dispatch_once(&onceToken, ^{

            NSLog(@"------run");//默认线程是安全的

        });

    /******使用GCD实现快速迭代遍历******/

    dispatch_apply(10, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t index) {

            //执行10次代码,index顺序不确定

     });

    /******barrier阻塞函数的使用(隔断队列的执行顺序,队列中这个函数前面的任务执行完,才会执行这个函数后面的任务)******/

    注意点:这个函数不能使用全局队列,只能自己创建并发队列

    dispatch_queue_t queue = dispatch_queue_create("wangliang", DISPATCH_QUEUE_CONCURRENT);

    dispatch_barrier_async(queue, ^{

            NSLog(@"----barrier-----%@", [NSThread currentThread]);

     });

    /******队列组的使用******/

    1.创建队列

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    2.创建队列组

    dispatch_group_t group = dispatch_group_create();

    3.执行队列组任务

    dispatch_group_async(group, queue, ^{

            //任务一

    });

    dispatch_group_async(group, queue, ^{

            //任务二

    });

    4.队列组中任务一任务二都完成了才会执行下面的内容

    dispatch_group_notify(group, queue, ^{

            //队列组中任务都完成了之后要做的操作放在此处

            // 回到主线程显示图片

            dispatch_async(dispatch_get_main_queue(), ^{

                //图片显示出来 

                self.imageView.image = image;

            });

    });

  • 相关阅读:
    (二)微信开发工具
    (一)微信小程序环境搭建
    mysql安装--window版
    (六--二)scrapy框架之持久化操作
    windows安装redis
    (六--一)scrapy框架简介和基础应用
    (五)selenuim和phantonJs处理网页动态加载数据的爬取
    (四)requests模块的cookies和代理操作
    (三)三种数据解析方式学习
    (二)requests模块
  • 原文地址:https://www.cnblogs.com/wangliang2015/p/5407743.html
Copyright © 2020-2023  润新知