GCD的工作原理:
让程序平行排队的特定任务,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务(比如一个函数).
GCD中的队列称为dispatch queue,它可以保证先进来的任务先得到执行
dispatch queue又分为三种:
Serial
又称为private dispatch queues,同时只执行一个任务。所以也可以创建多个Serial queue,它们各自是同步执行的,但Serial queue之间是并发执行的。
Concurrent
又称为global dispatch queue,可以并发地执行多个任务,但是执行完成的顺序是随机的。
Main dispatch queue
它是全局可用的serial queue,它是在应用程序主线程上执行任务的(UI线程:程序打开的第一个页面)。
常用的几种方法:
1.dispatch_async
为了避免界面在处理耗时的操作时卡死,比如读取网络数据,数据库读写等,会在另外一个线程中处理这些操作,然后通知主线程更新界面。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 耗时的操作 比如下载图片
dispatch_async(dispatch_get_main_queue(), ^{
// 通知主线程更新界面
});
});
2、dispatch_group_async
dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, queue, ^{ [NSThread sleepForTimeInterval:1]; NSLog(@"one"); }); dispatch_group_async(group, queue, ^{ [NSThread sleepForTimeInterval:2]; NSLog(@"two"); }); dispatch_group_async(group, queue, ^{ [NSThread sleepForTimeInterval:3]; NSLog(@"three"); }); dispatch_group_notify(group, dispatch_get_main_queue(), ^{ NSLog(@"UI"); }); dispatch_release(group);
根据上面代码执行之后的结果是:one 、two、three、UI
因为只有前三个任务完成之后才会执行最后一个任务。
3、dispatch_barrier_async
dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行。
dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT); dispatch_async(queue, ^{ [NSThread sleepForTimeInterval:2]; NSLog(@"dispatch_async_one"); }); dispatch_async(queue, ^{ [NSThread sleepForTimeInterval:4]; NSLog(@"dispatch_async_two"); }); dispatch_barrier_async(queue, ^{ NSLog(@"dispatch_barrier_async"); [NSThread sleepForTimeInterval:4]; }); dispatch_async(queue, ^{ [NSThread sleepForTimeInterval:1]; NSLog(@"dispatch_async_three"); });
最终输出的顺序为dispatch_async_one、dispatch_async_two、dispatch_barrier_async、dispatch_async_three