美文网首页
iOS GCD 线程调用

iOS GCD 线程调用

作者: 前行的骆驼 | 来源:发表于2019-11-05 09:29 被阅读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(队列名)

    相关文章

      网友评论

          本文标题:iOS GCD 线程调用

          本文链接:https://www.haomeiwen.com/subject/xxqsbctx.html