iOS多线程之5.GCD的基本使用

  上一篇文章我对GCD的几个基本概念做了介绍,但是大家看完了可能觉得对理解GCD并没有什么卵用。其实会用GCD其实很简单,只要记住两条就可以了。

1.  主队列里的任务必须在异步函数中执行。

  主队列里的任务如果在同步函数中执行,就会造成死锁。什么是死锁?容我举例来说明。

  看到没有,主队列里的任务没有执行,程序也没有往下执行,这就叫做死锁。那又为什么会发生死锁。主队列里的任务默认都在主线程中执行,程序都把主队列里的任务放在主线程的最后面。当程序执行到2时,会把任务1放在主线程的后面,等主线程里的任务都执行完了在执行。可是这是什么函数啊?这是同步函数啊,它会堵塞当前的线程,后面的任务会等任务1执行完再执行。所以他们又开始互相等待,永远不会往下执行了。

任务1对其他任务说:你们快执行啊?你们执行完我才能执行!

其他任务对任务1说:不行啊,你执行完我们才能执行。这是同步那个二货规定的。

任务1和其他任务就开始了漫长的等待……

2.  全局并发队列里的任务在异步函数中执行才能实现并发。

  我们发现程序创建了三条线程,每条线程都执行下载图片的任务,三张图片几乎是同时开始下载的。这就实现了并发,也没有堵塞主线程。最重要的一点,下载完的图片,一定要在主线程更新。

如果有兴趣可以试试把并发队列里的任务放在同步函数中执行,我们就会发现三张图片的下载都是在主线程中进行的,图片好长时间才下载完。因为图片是一个一个下载的,而不像上面是同时开始下载。

至于自定义队列,我就不讲了,因为和上面的原理差不多,而且用的地方也不多。并发队列系统已经提供了,我们就不要自己创建了。至于串行队列,我们运用多线程就是为了多任务同时进行,串行队列里的任务无论在同步函数还是异步函数中,都不可能同时进行。

关于GCD还有很多其他的用处,我会在下一篇文章中讲。

时间: 10-31

iOS多线程之5.GCD的基本使用的相关文章

iOS多线程之GCD小记

iOS多线程之GCD小记 iOS多线程方案简介 从各种资料中了解到,iOS中目前有4套多线程的方案,分别是下列4中: 1.Pthreads 这是一套可以在很多操作系统上通用的多线程API,是基于C语言的,在在oc中使用时需要包含 #import<pthread.h> 使用这种多线程方案需要手动处理线程的各个状态的转换,也就是要管理线程的生命周期. 2.NSThread 这种多线程方案经过了苹果的封装,是一种面向对象的方案,因此可以直接操控线程对象,相对来说比较便捷,其生命周期也要手动管理 3.

(五十五)iOS多线程之GCD

GCD的全称为Grand Central Dispatch,翻译为大中央调度,是Apple开发的一个多线程编程解决方法. 进程和线程的概念: 正在进行中的程序被称为进程,负责程序运行的内存分配,每一个进程都有自己独立的虚拟内存空间. 线程是进程中一个独立的执行路径,即主线程,主线程有1M的栈区,对于耗时的执行路径,可以放在子线程(512K栈区)中执行. Tip:新建线程会消耗内存空间和CPU事件,线程太多会降低系统的运行性能,多线程是通过CPU时分复用实现的. Tip:多线程是为了并发执行多项任

iOS多线程之GCD学习笔记

什么是GCD 1.全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 2.纯C语言,提供了非常多强大的函数 GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核.四核) GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码 任务和队列 GCD中有2个核心概念 任务:执行什么操作 队列:用来存放任务 GCD的使用就2个步骤,首先确定定制任务(

ios多线程之GCD

** dispatch_after 延时操作应用场景 例如:游戏后台需要做一些随机的事件,需要在某个时间后,调用方法! 1> 调用的方法通常是跟UI有关的,例如提示用户等 2> 不了解GCD或者多线程的人,可以直接填空即可 */ - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self delay1]; } #pragma mark - 延时操作 /** 在其他线程中调用 dispatch_after */

iOS多线程之NSThread使用

iOS中的多线程技术 我们在iOS开发项目过程中,为了解决UI界面操作不被耗时操作阻塞,我们会使用到多线程技术.在iOS开发中,我们主要会用到三种多线程操作技术:NSThread,NSOperation,GCD. 1.Thread :是三种方法里面相对轻量级的,但需要管理线程的生命周期.同步.加锁问题,这会导致一定的性能开销2.Cocoa Operations:是基于OC实现的,NSOperation以面向对象的方式封装了需要执行的操作,不必关心线程管理.同步等问题.NSOperation是一个

IOS多线程之Block编程

1 什么是block iOS SDK 4.0開始,Apple引入了block这一特性.字面上说,block就是一个代码块.可是它的奇妙之处在于在内联(inline)运行的时候(这和C++非常像)还能够传递參数. 同一时候block本身也能够被作为參数在方法和函数间传递.这就给予了block无限的可能. 对于闭包(block),有非常多定义.当中闭包就是可以读取其他函数内部变量的函数,这个定义即接近本质又较好理解. 对于刚接触Block的同学,会认为有些绕,由于我们习惯写这种程序main(){ f

iOS多线程之NSThread

NSThread是轻量级的多线程开发,使用它需要我们自己管理线程的生命周期. 有两种方法创建启动线程. 方法1:对象方法 -(instancetype)initWithTarget:(id)target selector:(SEL)selector object:(id)argument; 方法2:类方法   +(void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument; 废话不多

ios多线程之NSThread头文件详解

1.NSThread 头文件中的相关方法 //获取当前线程 +(NSThread *)currentThread; //创建线程后自动启动线程 + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument; //是否是多线程 + (BOOL)isMultiThreaded; //线程字典 - (NSMutableDictionary *)threadDictionary; //线

IOS多线程之NSOperation学习总结

NSOperation简介 1.NSOperation的作用 配合使用NSOperation和NSOperationQueue也能实现多线程编程 2.NSOperation和NSOperationQueue实现多线程的具体步骤 先将需要执行的操作封装到一个NSOperation对象中 然后将NSOperation对象添加到NSOperationQueue中 系统会自动将NSOperationQueue中的NSOperation取出来 将取出的NSOperation封装的操作放到一条新线程中执行