- (void)viewDidLoad {
[super viewDidLoad];
//GCD: Grand Central Dispatch 牛逼的中枢调度器
//纯C语言, 提供了非常多强大的函数;自动管理线程的生命周期;苹果推荐
//GCD中两个核心概念
//1.任务:执行什么操作
//2.队列:用来存放任务
//GCD的使用步骤
//1.定制任务--确定想做的事情
//2.将任务添加到队列中--GCD会自动将队列中的任务取出,放到对应的线程中执行;--任务的取出遵循队列的FIFO原则:先进先出,后进后出
//GCD中有两个用来执行任务的函数
//1.用同步的方式执行任务,不具备开启新线程的能力
//其中的参数为: queue : 队列; block:任务
//dispatch_sync(dispatch_queue_t queue, <#^(void)block#>);
//2.用异步的方式执行任务, 具备开启新线程的能力
//dispatch_async(dispatch_queue_t queue, <#^(void)block#>);
//同步和异步的区别,同步和异步决定了要不要开启新的线程
//同步:在当前的线程中执行,不具备开启新线程;异步:在另一条线程中执行,具备开启新线程
//并发和串行决定任务的执行方式,同时还是一个一个
//GCD默认已经提供了全局的并发队列供整个应用的使用不需手动创建
//GCD的队列可以分为2大类
//1.并发队列,可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务),并发只有在异步函数才有效
//2.串行队列,让任务一个接一个的执行
//[self asyncGlobalQueue];
//[self asyncSerialQueue];
//[self syncGlobalQueue];
[self syncSerialQueue];
}
#pragma mark - 异步
/**
* 用dispatch_async异步函数往并发队列中添加任务
*/
- (void)asyncGlobalQueue {
//1,获取全局的并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//2.添加任务到队列中执行任务
dispatch_async(queue, ^{
NSLog(@"1---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"2---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"3---%@", [NSThread currentThread]);
});
//总结:同时开启3个线程
}
/**
* 用dispatch_async异步函数往串行队列中添加任务
*/
- (void)asyncSerialQueue {
//1.创建串行队列(GCD中获取串行的两种途径)1:
dispatch_queue_t queue = dispatch_queue_create("com.guofu.queue", NULL);
//2:
//2.添加任务到队列中执行任务
dispatch_async(queue, ^{
NSLog(@"1---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"2---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"3---%@", [NSThread currentThread]);
});
//总结:只开一个线程
//3.如果在非ARC下需要释放资源
//dispatch_release(queue);
}
#pragma mark - 同步
/**
* 用dispatch_sync同步函数往并发队列中添加任务
*/
- (void)syncGlobalQueue {
//1,获取全局的并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//2.添加任务到队列中执行任务
dispatch_sync(queue, ^{
NSLog(@"1---%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"2---%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"3---%@", [NSThread currentThread]);
});
//总结:不会开启线程,并发队列失去并发功能
}
/**
* 用dispatch_sync异步函数往串行队列中添加任务
*/
- (void)syncSerialQueue {
//1.创建串行队列
dispatch_queue_t queue = dispatch_queue_create("com.guofu.queue", NULL);
//2.添加任务到队列中执行任务
dispatch_sync(queue, ^{
NSLog(@"1---%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"2---%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"3---%@", [NSThread currentThread]);
});
//总结:不会开启新的线程
}
/*
同步(sync)函数
并发队列:不会开线程
串行队列:不会开线程
异步(async)函数
并发队列:可以开启多条线程,取决去任务的个数
串行队列:开一条线程
凡是函数名中带有create\copy\new\retain.都需要在不需要这个数据的术后进行release
GCD的数据类型在ARC环境下不需要做release
CF(core Foundation)的数据类型在ARC下还是要做release
*/
原文:http://www.cnblogs.com/guofuzhang/p/5195829.html