首页 > 其他 > 详细

GCD-01

时间:2016-02-17 17:17:29      阅读:223      评论:0      收藏:0      [点我收藏+]

- (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

 */

GCD-01

原文:http://www.cnblogs.com/guofuzhang/p/5195829.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!