GCD以队列的形式进行操作,特点:FIFO先进先出
说明:同步函数不具备开启线程的能力,无论是什么队列都不会开启线程;异步函数具备开启线程的能力,开启几条线程由队列决定(串行队列只会开启一条新的线程,并发队列会开启多条线程)。
同步函数
(1)并发队列:不会开线程
(2)串行队列:不会开线程
异步函数
(1)并发队列:能开启N条线程
(2)串行队列:开启1条线程
static MyHandle *handle = nil
1 使用GCD创建单例 2 + (instancetype)shareMyHandle { 3 4 // 在GCD中只执行一次,用于记录内容是否执行过 5 static dispatch_once_t onceToken; 6 7 dispatch_once(&onceToken, ^{ 8 handle = [[MyHandle alloc] init]; 9 }); 10 11 return handle; 12 }
1 #pragma mark - 使用GCD去创建一个串行队列 2 3 // 第一种:系统提供的创建串行队列的方法 4 dispatch_queue_t queue = dispatch_get_main_queue(); // 在真正的开发中,如果需要创建串行队列,比较习惯这种 5 6 7 // 第二种:自己去创建 8 // 参数1:系统提供的一个宏 9 // 参数2:系统的保留字段 10 // 两个参数的位置没有严格的限定,只要都写对就行了 11 dispatch_queue_t queue1 = dispatch_queue_create(DISPATCH_QUEUE_SERIAL, 0);
1 #pragma mark - 使用GCD创建一个并行队列 2 3 // 第一种方式:系统自带的方法 4 // 参数1:优先级设置(有四个,没有明显的区别) 5 // 参数2:系统保留字段 6 dispatch_queue_t queue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); 7 8 9 // 第二种:自己去创建 10 // 参数1:表示这个对列的名字 11 // 参数2:系统提供的一个宏 12 dispatch_queue_t queue3 = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
1 // 给队列添加任务 2 dispatch_async(queue, ^{ 3 4 NSLog(@"1c%@", [NSThread currentThread]); 5 NSLog(@"1m%@", [NSThread mainThread]); 6 });
1 #pragma mark - 几秒之后去做一件事 2 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 3 4 NSLog(@"3.0秒之后"); 5 });
1 #pragma mark - 重复向一个队列中添加多个任务 2 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); 3 4 dispatch_apply(100, queue, ^(size_t index) { 5 6 NSLog(@"%ld", index); 7 });
1 #pragma mark - 分组和监听 2 3 // 创建一个分组 4 dispatch_group_t group = dispatch_group_create(); 5 6 7 // 创建一个队列 8 dispatch_queue_t queue = dispatch_queue_create(0, DISPATCH_QUEUE_CONCURRENT); 9 10 11 // 创建任务1: 12 dispatch_group_async(group, queue, ^{ 13 14 NSLog(@"我是任务1"); 15 }); 16 17 // 创建任务2: 18 dispatch_group_async(group, queue, ^{ 19 20 NSLog(@"我是任务2"); 21 }); 22 23 24 // 用于监听所有任务的执行情况的【所以此功能代码必须放在所有任务之后】 25 dispatch_group_notify(group, queue, ^{ 26 27 NSLog(@"我是在所有任务之后执行的"); 28 });
1 #pragma mark - 并发中的串行 2 3 // DISPATCH_QUEUE_SERIAL 串行:任务顺序执行 4 // DISPATCH_QUEUE_CONCURRENT 并行:无须 5 // 创建串行队列 6 dispatch_queue_t queue = dispatch_queue_create(0, DISPATCH_QUEUE_SERIAL); 7 8 9 // 添加任务 10 dispatch_async(queue, ^{ 11 NSLog(@"任务1"); 12 }); 13 14 dispatch_async(queue, ^{ 15 NSLog(@"任务2"); 16 }); 17 18 dispatch_async(queue, ^{ 19 NSLog(@"任务3"); 20 }); 21 22 dispatch_async(queue, ^{ 23 NSLog(@"任务4"); 24 });
1 // 在子线程中获取网络数据,并在主线程中刷新UI 2 - (void)loadData { 3 4 NSURL *url = [NSURL URLWithString:@"http://m.baidu.com"]; 5 NSURLSession *session = [NSURLSession sharedSession]; 6 NSURLSessionTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 7 8 if (error == nil) { 9 10 // 处理数据 11 12 // 回到主线程刷新UI 13 dispatch_async(dispatch_get_main_queue(), ^{ 14 15 16 }); 17 } 18 }]; 19 20 [task resume]; 21 }