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  

点击这里去下载演示Demo


我是Qinz,希望我的文章对你有帮助。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • 从哪说起呢? 单纯讲多线程编程真的不知道从哪下嘴。。 不如我直接引用一个最简单的问题,以这个作为切入点好了 在ma...
    Mr_Baymax阅读 2,714评论 1 17
  • 多线程 在iOS开发中为提高程序的运行效率会将比较耗时的操作放在子线程中执行,iOS系统进程默认启动一个主线程,用...
    郭豪豪阅读 2,576评论 0 4
  • 目录: (一)线程与进程之间的区别 (二)为什么需要学习多线程 (三)多线程任务执行方式 (四)多线程执行的...
    KingLionsFrank阅读 765评论 6 6
  • 本篇博客共分以下几个模块来介绍GCD的相关内容: 多线程相关概念 多线程编程技术的优缺点比较? GCD中的三种队列...
    有梦想的老伯伯阅读 1,008评论 0 4
  • 你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里 转载请注明出处 h...
    WWWWDotPNG阅读 4,574评论 2 28