GCD使用小结

GCD是iOS开发过程当中使用的比较频繁也比较重要的一块,往往项目里涉及到这方面的代码基本都是核心功能,维护的时候都小心翼翼,如果这里出问题给调试带来的难度是较大的。

下面我就来回顾温习一下GCD有关知识,如有纰漏和不足,欢迎指正。

本文主要通过一下几个模块来进行总结:

(1)多线程概念;

(2)几种多线程编程的优缺点;

(3) GCD中的几种队列类型;

(4)GCD中系统提供的常用dispatch方法;

多线程相关概念

1. 线程与进程:

进程:是指程序在计算机上的一次执行过程,例如开启微信,就是开启了一个进程,进程可包含多个线程。

线程:一组独立执行的代码段,一个线程同时只能执行一个任务,故而多线程并发就是指在同一时间执行多个任务。

iOS程序中,主线程(又称为UI线程)主要任务就是显示和刷新UI,也只有主线程可以直接修改UI,其他耗时操作会放在子线程(又称为异步线程)处理,这样可以提高程序的执行效率,提高资源的利用率。

主线程的堆栈大小是1M,其他线程开都是512KB,而且这个值不可更改,这也就意味着只要开启一个线程就会占用一部分内存,线程越多程序的性能也随之降低,所以一般不建议同时开启多个线程。

2. 线程按照执行方式又可细分:

同步线程:同步线程会阻塞当前线程然后开始执行该线程内的任务,任务执行完之后才会返回当前线程;

异步线程:异步线程不会阻塞当前线程,会开启其他线程去执行线程内的任务;

这里来说下串行和并发的概念:

串行队列:任务按先后顺序逐个执行,需要等待前一个任务执行完之后才开始执行下一个任务;

并发队列:多个任务按先后顺序一起开始执行,不用等待前一个任务执行完就可以执行下一个任务,因为任务添加的先后顺序间隔往往忽略不计,所以看起来像是一起执行的。

并发和并行也是两个不同的概念:并行是基于多核设备的,并行一定是并发,而并发不一定是并行。

3. 多线程编程中会经常遇到的问题:

死锁:两个或多个线程都在等待对方完成某个操作才能进行下一步操作,这时候就会发生死锁;

互斥锁:能够防止多线程抢夺资源造成的数据安全问题,但是需要消耗大量的资源;

原子属性(atomic)加锁:当属性以atomic修饰时,该属性就能支持互斥锁了,反之若以nonatomic修饰,表示忽略了线程安全;

上下文切换:当一个进程中有多个线程来回切换时,content switch用来记录执行状态,这是就会产生一些额外的开销。

几种多线程编程的优缺点

1. NSThread

优点:轻量级简单易用,可以直接操作线程对象;

缺点:需要自己管理线程的生命周期,线程同步;

2. NSOperation

优点:基于GCD对GCD的封装,比GCD更加面向对象,不需要关心线程管理;

缺点:使用时必须使用它的子类;

3. GCD

优点:基于C语言更底层更高效,并且不属于cocoa框架,简单易用,效率高,速度快,自动管理线程生命周期;

缺点:如果遇到较复杂的使用场景,很大可能会遇到死锁问题;

GCD中的几种队列类型

Dispatch block的执行最终都会放进某个队列中去执行,GCD中相关函数的创建一般都以dispatch开头:

(1)Mainqueue主线程串行队列:通过dispatch_get_main_queue来获取;

(2)Global queue 全局并发队列:通过dispatch_get_global_queue来获取,可以设置优先级;

(3)Custom queue 自定义队列:通过dispatch_queue_create来获取;

(4)Groupqueue 组队列:通过dispatch_group_create来获取;

GCD中系统提供的常用dispatch方法

1. Dispatch_after 延时添加到队列;

示例如下:

Dispatch_after

从打印信息来看Dispatch_after只是延时提交block,并没有延时后立即执行block,因此它不能实现精确控制。

2. Diapatch_apply :在给定的队列上多次执行某一任务,在主线程直接调用会阻塞主线程去执行block中的任务,所以一般把它放在异步队列中执行

示例如下:

Diapatch_apply

3. Dispatch_once:保证在app运行期间,block中的代码只执行一次

比如一个经典的使用场景:单例

Dispatch_once

4. Dispatch_barrier_async :栅栏作用

在并发队列中,等待在Dispatch_barrier之前加入的队列全部执行完,再执行Dispatch_barrier中的任务,执行完之后再开始执行Dispatch_barrier之后加入到队列的任务。

示例如下:

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

推荐阅读更多精彩内容