IOS 主队列,全局队列的关系

Posted 预见者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS 主队列,全局队列的关系相关的知识,希望对你有一定的参考价值。

 

  同步,异步,串行,并发

        同步和异步代表会不会开辟新的线程。串行和并发代表任务执行的方式。

        同步串行和同步并发,任务执行的方式是一样的。没有区别,因为没有开辟新的线程,所有的任务都是在一条线程里面执行。

        异步串行和异步并发,任务执行的方式是有区别的,异步串行会开辟一条新的线程,队列中所有任务按照添加的顺序一个一个执行,异步并发会开辟多条线程,至于具体开辟多少条线程,是由系统决定的,但是所有的任务好像就是同时执行的一样。

       

        开辟队列的方法:

        dispatch_queue_t myQueue = dispatch_queue_create("MyQueue", NULL);

                /**

                    参数1:标签,用于区分队列

                    参数2:队列的类型,表示这个队列是串行队列还是并发队列NUll表示串行队列,

                DISPATCH_QUEUE_CONCURRENT表示并发队列

                    */

        执行队列的方法

               异步执行

        dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)

               同步执行

               dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)

 

主队列

    主队列:专门负责调度主线程度的任务,没有办法开辟新的线程。所以,在主队列下的任务不管是异步任务还是同步任务都不会开辟线程,任务只会在主线程顺序执行。

    主队列异步任务:现将任务放在主队列中,但是不是马上执行,等到主队列中的其它所有除我们使用代码添加到主队列的任务的任务都执行完毕之后才会执行我们使用代码添加的任务。 

    主队列同步任务:容易阻塞主线程,所以不要这样写。原因:我们自己代码任务需要马上执行,但是主线程正在执行代码任务的方法体,因此代码任务就必须等待,而主线程又在等待代码任务的完成好去完成下面的任务,因此就形成了相互等待。整个主线程就被阻塞了。

 全局队列

    全局队列:本质是一个并发队列,由系统提供,方便编程,可以不用创建就直接使用。

    获取全局队列的方法:dispatch_get_global_queue(long indentifier.unsigned long flags)

    /**

    参数说明:

        参数1:代表该任务的优先级,默认写0就行,不要使用系统提供的枚举类型,因为ios7和ios8的枚举数值不一样,使用数字可以通用。

    参数2:苹果保留关键字,一般也写0

    */

    全局队列和并发队列的区别:

    1,全局队列没有名字,但是并发队列有名字。有名字可以便于查看系统日志

    2,全局队列是所有应用程序共享的。

    3,在mrc的时候,全局队列不用手动释放,但是并发队列需要。

以上是关于IOS 主队列,全局队列的关系的主要内容,如果未能解决你的问题,请参考以下文章

同步,异步,串行队列,并发队列,全局队列,主队列等概念的总结

GCD 中的“全局队列”和“主队列”有啥区别?

GCD 全局队列任务在主线程上运行

GCD 全局并发队列并不总是并发(iOS 设备)?

来自dispatch_async全局崩溃的C函数调用,但在主队列上工作

ios多线程同步异步、串行并行队列、死锁