GCD核心概念:
1,任务和队列。
任务:要做什么
队列:存放任务。
GCD使用步骤:
1,创建队列
2,封装任务,把任务添加到队列中。
封装任务的函数:
同步函数: dispatch_sync 该函数不具备开辟线程的能力,不能开辟线程。
任务执行的方式: 同步
异步函数:dispatch_async 该函数具备开辟线程的能力,可以开辟线程。
任务执行的方式: 异步
GCD中的队列:
1, 并发队列:任务可以同时执行
“只要第一个任务取出来之后,不用等待执行完毕,就可以接着取第二个任务”
2,串行队列:任务必须一个接一个的执行
“第一个任务取出来之后,必须等待该任务执行完,才可以接着取第二个任务”
异步函数+并发队列: 会开辟多条子线程,所有的任务并发执行(开几条线程不是由任务的数量决定的,是GCD内部自动决定的)
异步函数+串行队列:会开辟一条子线程,所有的任务在该子线程中串行执行。
同步函数+并发队列:不会开辟子线程,所有的任务在当前线程中串行执行。
同步函数+串行队列:不会开辟子线程,所有的任务在当前线程中串行执行。
代码示例:
//创建串行队列
dispatch_queue_t queue = dispatch_queue_create("com.dahuatech.lsp", DISPATCH_QUEUE_SERIAL);
//封装任务,将任务添加到队列中
dispatch_async(queue, ^{
NSLog(@"1---%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"2---%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"3---%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"4---%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"5---%@",[NSThread currentThread]);
});
上面的代码只会开辟一条线程,按顺序串行执行
2019-02-16 22:10:50.024775+0800 下载图片[5657:173638] 1---<NSThread: 0x600001c201c0>{number = 3, name = (null)}
2019-02-16 22:10:50.024912+0800 下载图片[5657:173638] 2---<NSThread: 0x600001c201c0>{number = 3, name = (null)}
2019-02-16 22:10:50.025098+0800 下载图片[5657:173638] 3---<NSThread: 0x600001c201c0>{number = 3, name = (null)}
2019-02-16 22:10:50.025219+0800 下载图片[5657:173638] 4---<NSThread: 0x600001c201c0>{number = 3, name = (null)}
2019-02-16 22:10:50.025346+0800 下载图片[5657:173638] 5---<NSThread: 0x600001c201c0>{number = 3, name = (null)}
示例二:
//创建并发队列
dispatch_queue_t queue = dispatch_queue_create("com.dahuatech.lsp", DISPATCH_QUEUE_CONCURRENT);
//封装任务,将任务添加到队列中
dispatch_async(queue, ^{
NSLog(@"1---%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"2---%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"3---%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"4---%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"5---%@",[NSThread currentThread]);
});
2019-02-16 22:19:59.202672+0800 下载图片[5927:185481] 4---<NSThread: 0x60000258d800>{number = 6, name = (null)}
2019-02-16 22:19:59.202704+0800 下载图片[5927:185479] 2---<NSThread: 0x6000025b3140>{number = 4, name = (null)}
2019-02-16 22:19:59.202731+0800 下载图片[5927:185478] 3---<NSThread: 0x6000025b3200>{number = 5, name = (null)}
2019-02-16 22:19:59.202752+0800 下载图片[5927:185480] 1---<NSThread: 0x6000025b2ac0>{number = 3, name = (null)}
2019-02-16 22:19:59.203265+0800 下载图片[5927:185508] 5---<NSThread: 0x6000025b3400>{number = 7, name = (null)}
因为使用的都是异步函数dispatch_async,都有开辟线程的能力,并发队列会开辟多条线程去执行不同的任务。
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);这个是全局并发队列,和创建的并发队列DISPATCH_QUEUE_CONCURRENT没有区别。