iOS多线程之GCD小记
iOS多线程方案简介
从各种资料中了解到,iOS中目前有4套多线程的方案,分别是下列4中:
1、Pthreads
这是一套可以在很多操作系统上通用的多线程API,是基于C语言的,在在oc中使用时需要包含
#import<pthread.h>
使用这种多线程方案需要手动处理线程的各个状态的转换,也就是要管理线程的生命周期。
2、NSThread
这种多线程方案经过了苹果的封装,是一种面向对象的方案,因此可以直接操控线程对象,相对来说比较便捷,其生命周期也要手动管理
3、GCD
全称Grand Central Dispatch,是苹果开发的一套多线程解决方案。
4、NSOperation & NSOperationQueue
NSOperation是苹果对GCD的进一步封装,完全面向对象
好的,大体介绍了这几种多线程方案后,我们正式选择走进GCD。
GCD
GCD提供了一套全新的API共用户使用,它可以将应用需要执行的工作拆分为可分散在多个线程和多个CPU上的更小的块。它可以自动管理线程生命周期(线程创建、任务调度、线程销毁)。用户只需将要执行的任务告诉GCD就行了。GCD使用的也是C语言。它可以使用程序库(Block)进行访问。
GCD中有两个概念:任务和队列
任务就是操作,就是用户想要做的事情,可以用一段代码来表示。任务执行方式分为同步和异步。
队列用于存放任务,队列分为串行队列和并行队列两种。
创建队列
在所有的任务队列中,有一个主队列,它负责UI的刷新,任何耗时的任务都不应该放在主队列中。创建主队列的代码如下:
dispatch_queue_t queue = ispatch_get_main_queue();
创建串行队列
dispatch_queue_t queue = dispatch_queue_create("testQueue1", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t queue = dispatch_queue_create("testQueue2", NULL);
第一个参数是队列的标识符,用来唯一识别队列。第二个参数说明队列的性质是串行还是并行。
创建并行队列
dispatch_queue_t queue = dispatch_queue_create("testQueue3", DISPATCH_QUEUE_CONCURRENT);
全局并行队列
这个队列是系统提供的,其获取方式如下
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
第一个参数表示队列的优先级,第二个参数暂时未使用,设置为0
创建任务
任务分为同步任务和异步任务
创建同步任务
dispatch_sync(<testQueue3>, ^{
//程序块,即要执行的具体任务
//GCD获取这里的整个程序块,然后将它传递给一个后台线程,
//程序块将在这里一次执行异步,就像在主线中一样
});
第一个参数传入队列名,即要把新创建的任务加入到哪个队列中,第二个参数是一个程序块
创建异步任务
dispatch_async(<testQueue3>, ^{
//程序块,即要执行的任务
});
从其他线程返回主线程
dispatch_async(dispatch_get_main_queue(), ^{
});
总结
事实上,GCD就是帮你封装好了多线程的操作
一个列队相当于一个线程,在列队里面的任务都是按照先进先出的顺序来执行的
暂时就只有这么粗浅的理解,时间充足的话,还是要实际编写一下代码,这样可以理解的更加深入。
部分代码参考:http://www.jianshu.com/p/0b0d9b1f1f19