iOS开发中多线程之GCD基础用法详解--Swift
Qinz
一问:什么是线程?
线程是程序执行流的最小单元,也是指进程内的可执行单元,可调度的实体。
二问:线程和进程什么关系和区别?
从一定意义上讲,进程就是一个应用程序在处理机上的一次执行过程,它是一个动态的概念,而线程是进程中的一部分,进程包含多个线程在运行。
1:一个线程只能属于一个进程,而一个进程至少有一个线程。
2:资源分配给进程,同一进程下的所有线程共享该进程下的所有资源。
3:处理机会给线程,即真正在处理上运行的是线程。
4:线程在执行过程过程中,需要协作同步,不同进程的线程要利用消息通信的方法实现同步。
5:调度线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。
6:不仅进程之间可以并发执行,同一进程的多个线程也行。
7:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。
好了,对于进程和线程的区别和联系应该是熟悉了,这里有一遍写的非常形象的文章方便你记忆 。
同时:消息队列则是与线程 ( Thread ) 相关的,换句话说,一个线程只能有一个消息队列 ( queue )与之相对应
主线程执行一:先来看下没有队列的情况
输出结果如下:可以看到当前是在主线程执行,并且代码都是按顺序依次执行。
二:队列的异步执行
输出结果如下:可以看到在主线程输出Ⓜ️时,🍎也穿插在主线程中输出,因为这里我们用到了async来进行异步执行,如果使用sync同步是什么结果呢?就是先将🍎的代码执行完,再打印出M的代码,和在主线程的执行顺序是一样的,可以自己去试试~
三:队列的优先级
输出结果如下:我们可以看到,🍇是在主线程中执行的,所以优先级是最高的,当然也是最先执行完成;🍎和Ⓜ️此时各自开一个异步执行的线程,而我们设置的🍎的Qos为background<Ⓜ️的utility,所以Ⓜ️会先执行完,因为它比🍎的优先级要高,为什么不是Ⓜ️全部执行完在执行🍎呢?因为它们是两个不同的队列,如果都是一个队列,那么它们就会串行执行,看下面的第四点串行队列就知道了。
四:串行队列
输出结果如下:我们可以看到在同一个线程中执行的代码是依次执行的,这就是串行。
五:并行队列:可以看到和串行队列的区别在于我们设置了队列的属性attributes为concurrent,也就是告诉它我们开启的是并行队列。
输出结果如下:可以看到它们都是同时执行的,穿插也没有什么规律
六:延迟执行
输出结果如下:可以看到是开启了一个子线程,延迟2秒后才执行接下来的代码
七:手动执行,当我们调用queue.activate()才会开始执行inactiveQueue队列中的函数
输出结果如下:和并行执行一样,因为我们在“attributes: [.concurrent, .initiallyInactive]”设置为了并行,区别就是此刻的队列需要手动开启才会执行。
八:监听任务的执行,这里有两种方式可以执行,都可以达到一样的效果;主要在于我们可以对于任务时候完成进行监听,做一些自己想要做的事情。
输出结果如下,对于一些想要知道任务是否完成在做另外的事情还是很方便的。
九:全局队列,使用简单方便
输出结果如下:
总结:上面介绍基本涵盖了GCD的常规用法,在项目的工程要适时适当使用多线程,可使项目的性能得到优化,不要将所有的东西都丢给主线程。当然Swift的GCD比OC用起来更加简洁和舒适,开启你的Swift多线程之旅吧~
熟悉多线程知识之后接下来可以进阶的看:iOS开发之带你畅游闭包Closure
我是Qinz,希望我的文章对你有帮助。