标签:
1.GCD的简单介绍
GCD全称Great Center Dispatch,我们可以给它起个‘滚床单’名字,便于更好的记忆
GCD是由苹果公司开发的技术。是为了优化应用程序,支持多核心处理器和其他的对称多处理系统的系统
GCD属于函数级的多线程,运用的是C语言(大部分接触的是block块),性能更高,功能也更加强大。
GCD首次发布在Mac OS X10.6,iOS4及以上也可以用。
2.CGD的2个核心
1)任务:具有一定功能的代码段。
主要分为同步任务和异步任务
同步任务:不管在哪种类型的队列中,都只会在当前线程中执行任务,不具备开启新的线程的能力,并且都是串行执行任务。
异步任务:如果是在自己创建的串行队列,则是在子线程中完成,串行执行任务。
如果是系统创建好的串行队列,则在主线程中完成,串行执行任务。
如果是创建的并发队列,在开启多个线程,并发执行任务。
2)队列:GCD以队列的方式进行工作。
主要分为串行队列和并行队列,其中有分为手动创建和系统提供的队列。
串行队列 (SerialQueue):一次只执行一个任务。Serial queue通常用于同步访问特定的资源或数据。当你创建多个Serial queue时,虽然他们各自是同步执行的,但Serial queue与Serial queue之间是并发执行的。SerialQueue能实现线程的同步。
并发队列 (ConcurrentQueue):可以并发的执行多个任务。但是遵循FIFO先进先出。
3.GCD的几个主要枚举参数
1)全局并发队列的优先级
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 //高 #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 //默认(中) #define DISPATCH_QUEUE_PRIORITY_LOW (-2) //低 #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN//后台
2)队列的类型属性
//串行队列
DISPATCH_QUEUE_SERIAL //并发队列 DISPATCH_QUEUE_CONCURRENT
4.GCD的主要应用
将各个应用写入一个button的方法中,点击button然后触发对应的方法
1)串行队列
//串行队列 - (IBAction)handleSerialQueue:(id)sender { //1.获取串行队列 //1)使用系统提供的串行队列(即主线程队列),往内部添加的任务都是添加到主线程上的,主要用于主线程与子线程之间的切换。 //这里提醒一下:dispatch_sync方法不能在主队列中调用,因为这会无限期的阻止线程并会导致你的应用死锁。所有通过GCD提交到主队列的任务必须是异步的。 //dispatch_queue_t queue1 = dispatch_get_main_queue(); //2)自己创建的串行队列(即创建一个子线程队列),往内部添加的任务都是在自己创建的子线程中完成的 //参数1:队列的唯一标示(和工程的唯一标识命名规则一样) 参数2:队列的属性类型(枚举即:是串行队列还是并发队列) dispatch_queue_t queue2 = dispatch_queue_create("com.i.cnblogs.dubuladuo",DISPATCH_QUEUE_SERIAL); //2.往队列中添加任务 //1)添加同步任务 dispatch_sync(queue2, ^{ NSLog(@"任务1%@",[NSThread currentThread]); }); dispatch_sync(queue2, ^{ NSLog(@"任务2%@",[NSThread currentThread]); }); //2)添加异步任务 dispatch_async(queue2, ^{ NSLog(@"任务1%@",[NSThread currentThread]); }); dispatch_async(queue2, ^{ NSLog(@"任务2%@",[NSThread currentThread]); }); //对于有create字眼的对象需要进行release dispatch_release(queue2); }
2)并发队列
//并发队列 - (IBAction)handleConcurrentQueun:(id)sender { //获取并发队列 //1)使用系统创建好的。全局队列 //参数1:队列的优先级 参数2:预留参数,主要为功能扩展 dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //2)自己创建的并发队列 dispatch_queue_t queue2 = dispatch_queue_create("com.i.cnblogs.dubuladuo", DISPATCH_QUEUE_CONCURRENT); //2.往队列中添加任务 //1)添加同步任务 dispatch_sync(queue1, ^{ NSLog(@"任务1%@",[NSThread currentThread]); }); dispatch_sync(queue1, ^{ NSLog(@"任务2%@",[NSThread currentThread]); }); //2)添加异步任务 dispatch_async(queue2, ^{ NSLog(@"任务1%@",[NSThread currentThread]); }); dispatch_async(queue2, ^{ NSLog(@"任务2%@",[NSThread currentThread]); }); //对于有create字眼的对象需要进行release dispatch_release(queue2); }
3)分组
//分组 - (IBAction)handleGroup:(id)sender { //1.创建并发队列 dispatch_queue_t queue = dispatch_queue_create("com.i.cnblogs.dubuladuo", DISPATCH_QUEUE_CONCURRENT); //2.创建分组 dispatch_group_t group = dispatch_group_create(); //3.向队列中添加任务,添加的为异步任务 //参数1:执行的分组 参数2:执行的队列 dispatch_group_async(group, queue, ^{ NSLog(@"第一部分"); }); dispatch_group_async(group, queue, ^{ NSLog(@"第二部分"); }); dispatch_group_async(group, queue, ^{ NSLog(@"第三部分"); }); //4.在分组的任务完成之后进行拼接 此方法在组中的各项任务完成后触发 dispatch_group_notify(group, queue, ^{ NSLog(@"拼接数据"); }); //5.释放所有权 dispatch_release(queue); dispatch_release(group); }
4)执行一次
//只执行一次,类似单例 - (IBAction)handleOnce:(id)sender { //1.创建一个对象 static dispatch_once_t onceToken; //参数:传的是dispatch_once_t的一个确切的地址,以此来判断,使得此方法只执行一次 dispatch_once(&onceToken, ^{ NSLog(@"11"); }); }
5)重复
//重复(类似于for循环,只不过不是按照顺序进行的) - (IBAction)handleApply:(id)sender { //1.创建并发队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //2.添加重复执行的任务 //参数1:执行的次数 参数2:执行的队列 参数3:当前执行到第几次 dispatch_apply(5, queue, ^(size_t index) { NSLog(@"%ld",index); }); }
6)障碍
//障碍:作用就是分割同一队列中的线程的执行顺序,比如:如果没有障碍,下面的写入文件和读取文件的顺序是随机的,而加入障碍,则先执行完障碍前的线程,然后才会执行障碍后的线程。 - (IBAction)handleBarrier:(id)sender { //1.创建并发队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //2.添加异步任务 dispatch_async(queue, ^{ NSLog(@"写入文件"); }); //3.添加障碍 dispatch_barrier_async(queue, ^{ NSLog(@"障碍物"); }); //4.再次添加异步任务 dispatch_async(queue, ^{ NSLog(@"读取文件"); }); }
7)延时
//延时 - (IBAction)handleDelay:(id)sender { //1.创建并发队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //2.创建延时 //参数1:开始的时间:现在 参数2:延续的时间 dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)); //3.添加任务 dispatch_after(time, queue, ^{ NSLog(@"延时执行"); }); }
标签:
原文地址:http://www.cnblogs.com/dubuladuo/p/4859697.html