iOS GCD 线程调用

2019-11-05  本文已影响0人  前行的骆驼

GCD:Grand Central Dispatch强大的中枢调节器

GCD:1.基于底层C语言的API接口

         2.定义用block任务

         3.提供更多的控制能力以及操作队列所不能完成的执行任务的能力

GCD优点:1.有自动调用多核(CPU)的能力

                 2.会自动管理线程的生命周期(创建线程,分配任务,销毁线程)

队列:串行队列,并行队列,主队列,全局队列(全局并发队列),组队列

操作:同步(不开辟新的线程),异步(开辟新的线程)

1.串行队列+同步:不开辟新线程,操作按顺序执行

    创建队列:    dispatch_queue_t 队列名  = dispatch_queue_create(队列名称,NULL);

    往队列中添加任务:(可添加多个任务)

    dispatch_sync(队列名, ^{     

        执行的任务;

    });

2.串行队列+异步:开辟新线程,操作按顺序执行

    创建队列:    dispatch_queue_t 队列名  = dispatch_queue_create(队列名称,NULL);

    往队列中添加任务:(可添加多个任务)

    dispatch_async(队列名, ^{     

        执行的任务;

    });

3.并行队列+同步:不开辟新线程,操作按顺序执行

    创建队列:    dispatch_queue_t 队列名  = dispatch_queue_create(队列名称,DISPATCH_QUEUE_CONCURRENT);

    往队列中添加任务:(可添加多个任务)

    dispatch_sync(队列名, ^{     

        执行的任务;

    });

4.并行队列+异步:开辟新线程,操作不按顺序执行

    创建队列:    dispatch_queue_t 队列名  = dispatch_queue_create(队列名称,DISPATCH_QUEUE_CONCURRENT);

    往队列中添加任务:(可添加多个任务)

    dispatch_async(队列名, ^{     

        执行的任务;

    });

5.主队列:在主线程中执行任务的队列(系统提供)

    dispatch_async(dispatch_get_main_queue(), ^{

        执行的任务;

    });

6.全局队列+同步:不开辟新线程,操作按顺序执行(系统提供);可以设置队列的优先级

    创建队列:    dispatch_queue_t 队列名 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    往队列中添加任务:(可添加多个任务)

    dispatch_sync(队列名, ^{     

        执行的任务;

    });

7.全局队列+异步:开辟新线程,操作不按顺序执行(系统提供);可以设置队列的优先级

    创建队列:    dispatch_queue_t 队列名 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    往队列中添加任务:(可添加多个任务)

    dispatch_async(队列名, ^{     

        执行的任务;

    });

8.组队列:各个队列组成(异步执行),操作没有按顺序执行,最后执行的操作放到dispatch_group_notify中

    创建组队列:dispatch_group_t 组队列名 = dispatch_group_create();

    创建队列:

        dispatch_queue_t 队列名1  = dispatch_queue_create(,);

        dispatch_queue_t 队列名2  = dispatch_queue_create(,);

        dispatch_queue_t 队列名3  = dispatch_queue_create(,);

        ......可添加多个队列

选择在组队列中的某个子队列上执行操作

    dispatch_group_async(组队列名, 队列名?, ^{

        执行的任务;

    });

    ......可添加多个任务

组队列执行的最后一个操作:

    dispatch_group_notify(组队列名,队列名?, ^{

        执行的任务;

    });

组队列可创建延迟执行:

创建休眠队列时间

    dispatch_time_t 时间名 =  dispatch_time(DISPATCH_TIME_NOW,n*NSEC_PER_SEC);

组队列休眠

    dispatch_group_wait(组队列名, 时间名);

    dispatch_once:用于检测该代码是否已经被调度,调度过的,不会往下执行代码,没被调度的才会执行以下代码

    static  dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        执行的代码;

    });

dispatch_semaphore_t:信号量,是GCD用来同步的一种方式,在信号量满足的情况下,操作任务一个个按顺序完成,若信号量为0是,则不会执行,线程阻塞;

创建信号量:

dispatch_semaphore_t 信号量名 = dispatch_semaphore_create(初始量);

增加信号量:

dispatch_semaphore_signal(信号量名);

减少信号量:

dispatch_semaphore_wait(信号量名, DISPATCH_TIME_FOREVER);

MRC下释放队列:dispatch_release(队列名)

上一篇下一篇

猜你喜欢

热点阅读