一、任务与队列:

1、执行任务的方式:

用同步的方式执行任务

dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
queue: 队列
block: 任务
用异步的方式执行任务
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

同步和异步的区别:

同步:只能在当前线程中执行任务,不具备开启新线程的能力

异步:可以在新的线程中执行任务,具备开启新线程的能力


二、队列的创建

并发和串行的区别:

并发:多个任务并发执行

串行:一个任务完成后,再执行下一个任务


串行队列的创建:

GCD提供两种获得串行队列的方式:

1、使用dispatch_queue_create函数创建串行队列

dispatch_queue_create(const char  *label, dispatch_queue_attr_t attr)

label: 表示队列的标识

attr:表示队列的属性,根据这个参数创建并行或者串行(串行使用

DISPATCH_QUEUE_SERIAL或者 NULL参数)

2、使用主队列(与主线程相关联的队列)

主队列是GCD自带的一种特殊的串行队列

放到主队列的任务都会在主线程中执行

使用dispatch_get_main_queue()获得主队列


并行队列的创建:


1、使用dispatch_queue_create函数创建串行队列

dispatch_queue_create(const char  *label, dispatch_queue_attr_t attr)

label: 表示队列的标识

attr:表示队列的属性,根据这个参数创建并行队列还是串行队列(并行使用

DISPATCH_QUEUE_CONCURRENT参数)

2、使用dispatch_get_global_queue函数获得全局的并发(GCD提供)


dispatch_get_global_queue(<#long identifier#>, <#unsigned long flags#>)

 第一个参数:队列的优先级


DISPATCH_QUEUE_PRIORITY_HIGH 2 //高
DISPATCH_QUEUE_PRIORITY_DEFAULT 0 //默认
DISPATCH_QUEUE_PRIORITY_LOW (-2) //低
DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN //后台

例:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

第二个参数:占时无用,传入0即可


代码展示使用方法:


#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [superviewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//    [self concurrentSync];
//    [self concurrentAsync];
//    [self globalSync];
//    [self globalAsync];
//    [self serialSync];
//    [self serialAsync];
//    [self mainSync];
    [selfmainASync];
}

#pragma mark ---并行队列

//并发队列 +同步任务:没有开启新的线程,任务是逐个执行的
-(void)concurrentSync {
    //创建并发队列
    dispatch_queue_t queue =dispatch_queue_create("myQueue",DISPATCH_QUEUE_CONCURRENT);
    //在队列里面添加任务
    //同步任务
    dispatch_sync(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"----1----%@", [NSThreadcurrentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"----2----%@", [NSThreadcurrentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"----3----%@", [NSThreadcurrentThread]);
        }
    });
    /*
     打印结果可以看出,同步只能在当前线程中执行任务,不具备开启新线程的能力
     */
}

//并发队列 +异步任务:开启了新线程,任务是并发的。
-(void)concurrentAsync {
    //创建并发任务
    dispatch_queue_t queue =dispatch_queue_create("queue",DISPATCH_QUEUE_CONCURRENT);
    //创建异步任务
    dispatch_async(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"---1---%@", [NSThreadcurrentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"---2---%@", [NSThreadcurrentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"---3---%@", [NSThreadcurrentThread]);
        }
    });
}

//全局队列 +同步任务 :没有开启新线程,任务逐个完成的
-(void)globalSync {
    //获得全局队列
    //第一个参数:队列优先级这里使用默认,第二个参数:一般传入0
    dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
    //创建同步任务:
    dispatch_sync(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"----1----%@", [NSThreadcurrentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"----2----%@", [NSThreadcurrentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"----3----%@", [NSThreadcurrentThread]);
        }
    });
}
//全局队列 +异步任务: 开启了新的线程任务并发完成
-(void)globalAsync {
    //获得全局队列
    //第一个参数:队列优先级这里使用默认,第二个参数:一般传入0
    dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
    //创建异步任务
    dispatch_async(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"---1---%@", [NSThreadcurrentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"---2---%@", [NSThreadcurrentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"---3---%@", [NSThreadcurrentThread]);
        }
    });
}

#pragma mark ---串行队列
//串行队列 +同步任务 没有开启新线程,任务逐个完成
-(void)serialSync {
    //创建串行队列第一个参数:队列名称  第二个参数:创建的队列类型(DISPATCH_QUEUE_SERIAL或者NULL)为串行队列
    dispatch_queue_t queue =dispatch_queue_create("queue",DISPATCH_QUEUE_SERIAL);
    //创建同步任务
    dispatch_sync(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"---1---%@", [NSThreadcurrentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"---2---%@", [NSThreadcurrentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"---3---%@", [NSThreadcurrentThread]);
        }
    });
    
}
// 串行队列 +异步任务: 开启新的线程,任务是逐个完成的
-(void)serialAsync {
    //创建串行队列第一个参数:队列名称  第二个参数:创建的队列类型(DISPATCH_QUEUE_SERIAL或者NULL)为串行队列
    dispatch_queue_t queue =dispatch_queue_create("queue",DISPATCH_QUEUE_SERIAL);
    //创建异步任务
    dispatch_async(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"---1---%@", [NSThreadcurrentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"---2---%@", [NSThreadcurrentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"---3---%@", [NSThreadcurrentThread]);
        }
    });
}
//主队列 +同步任务:会造成死锁,不能在主队列中年添加同步任务
-(void)mainSync {
    //获得主队列
    dispatch_queue_t queue =dispatch_get_main_queue();
    //创建同步任务
    dispatch_sync(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"---1---%@", [NSThreadcurrentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"---2---%@", [NSThreadcurrentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"---3---%@", [NSThreadcurrentThread]);
        }
    });
}
//主队列 +异步任务:没有开启新线程 任务还是逐个完成的
-(void)mainASync {
    //获得主队列
    dispatch_queue_t queue =dispatch_get_main_queue();
    //创建同步任务
    dispatch_async(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"---1---%@", [NSThreadcurrentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"---2---%@", [NSThreadcurrentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i =0; i < 5; i++) {
            NSLog(@"---3---%@", [NSThreadcurrentThread]);
        }
    });
}
- (void)didReceiveMemoryWarning {
    [superdidReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end