代码改变世界

GCD(1)

2015-10-16 05:07  真实16  阅读(179)  评论(0编辑  收藏  举报

//

//  ViewController.m

//  UI-NO-26

//

//  Created by Bruce on 15/8/28.

//  Copyright (c) 2015年 Bruce. All rights reserved.

//

 

#import "ViewController.h"

 

@interface ViewController ()

 

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    

    

//    死锁 在主队列(GCD)里面  在主线程(UI线程)同步执行任务

//    主队列  跟  主线程  是一个东西

//    同步执行  一个任务完毕之后  才会去执行另外一个任务

    

//    主队列(GCD)《同步执行》某个任务的时候  会等待前面的任务 执行完毕之后 再去执行  主队列里面的任务

//    但是  主队列 是在  主线程里面  执行任务的  《他们两个现在 在同一个线程里面》   线程 是顺序执行任务的   这时候 主线程 会等主队列里面的任务执行完毕  再去继续执行,    主队列  会等待  主线程  执行完毕  才回去执行 主队列 里面的任务

    

//    通过GCD 获得主队列 dispatch_get_main_queue

//    所有接收队列对象  都用dispatch_queue_t

//    dispatch_queue_t mainQueue =  dispatch_get_main_queue();

    /*

    NSLog(@"主线程执行到这暂停 等待主队列 执行");

//    同步执行任务 dispatch_sync

    dispatch_sync(mainQueue, ^{

        NSLog(@"主队列 等待 主线程  执行完毕之后  再执行");

    });

    

    NSLog(@"😢...");

    

    */

    

 

//    异步执行

//    异步 允许 开辟一个线程 (利用系统空闲时间去执行  程序员 不能控制)

//    同步 不允许 开辟线程  (同步顺序执行)

    

    /*

    NSLog(@"主线程 执行到 这 发现一个异步执行的代码, 会执行异步执行的代码,  但是  没有等待 里面的任务 执行完毕之后,  再去 继续执行主线程任务");

    

    

    

    dispatch_async(mainQueue, ^{

        

        NSLog(@"小异:小主 没有等我 他自己继续走 😢");

        

        NSLog(@"更新UI%@",[NSThread currentThread]);

    });

    

    NSLog(@"小主:不用等 小异  可以继续走 😈");

    */

    

//    dispatch_get_main_queue() 串行队列

    

//    dispatch_queue_create("", NULL) 串行队列

    

//    串行队列:按照顺序去执行队列

    /*

    dispatch_queue_t mainQueue =  dispatch_get_main_queue();

    

    dispatch_async(mainQueue, ^{

        NSLog(@"11111");

    });

    

    dispatch_async(mainQueue, ^{

        NSLog(@"22222");

    });

    

    dispatch_async(mainQueue, ^{

        NSLog(@"33333");

    });

    */

    

    /*

//    创建队列 《串行队列》

    dispatch_queue_t huluwaQueue =  dispatch_queue_create("葫芦娃", NULL);

    dispatch_sync(huluwaQueue, ^{

        NSLog(@"11111");

    });

    dispatch_sync(huluwaQueue, ^{

        NSLog(@"22222");

    });

    dispatch_sync(huluwaQueue, ^{

        NSLog(@"33333");

    });

    */

    

//    串行队列 有两种方式

//    1、主队列

//    2、创建队列

//    串行队列 是按照顺序 执行的

    

    

//    并发队列 可以指定队列任务的优先级

//    使用 全局并发队列

//#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

    

//    GCD默认已经提供了全局的并发队列,供整个应用使用,不需要手动创建 dispatch_get_global_queue

    /*

//    long identifier 指定优先级

    dispatch_queue_t firstQueue =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);

    dispatch_queue_t twoQueue =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

    dispatch_queue_t thirdQueue =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    

    dispatch_async(firstQueue, ^{

        NSLog(@"111111");

    });

    dispatch_async(twoQueue, ^{

        NSLog(@"222222");

    });

    dispatch_async(thirdQueue, ^{

        NSLog(@"333333");

    });

    

    

    */

    

    

    

//    分组

//    dispatch_group_create()  创建一个分组

//    dispatch_group_t 就相当于 类名

    dispatch_group_t num1 = dispatch_group_create();

    dispatch_queue_t queue1 = dispatch_queue_create("num1", NULL);

    

//    dispatch_group_t group 组名

//    dispatch_queue_t queue 线程名

    dispatch_group_async(num1, queue1, ^{

        NSLog(@"download1...");

    });

    

    dispatch_group_async(num1, queue1, ^{

        NSLog(@"download2...");

    });

    

//    分组执行完毕

    dispatch_group_notify(num1, queue1, ^{

        NSLog(@"执行完毕1");

    });

    

   

    dispatch_group_t num2 = dispatch_group_create();

    

    int nums;

    nums = 1;

    for (int i=0; i<nums; i++) {

        dispatch_group_async(num2, queue1, ^{

            NSLog(@"download1...");

        });

    }

  

    //    分组执行完毕

    dispatch_group_notify(num2, queue1, ^{

        NSLog(@"执行完毕2");

    });

}

 

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

 

@end