#ios多线程之GCD
##同步任务 dispatch_sync(dispatch_get_main_queue(), ^{}); 同步任务:dispatch_sync,会阻塞后面的任务,必需当前任务完成后才能执行下一个。 ##异步任务 dispatch_async(dispatch_get_main_queue(), ^{}); 异步执行:dispatch_async,不会阻塞后面的任务,任务会马上返回下一个任务不需要等待,当这个任务完成后会通知主线程。 ###主队列 dispatch_get_main_queue()主队列,主队列中的任务都会在主线程中执行, 是一个串行队列。主队列中不能执行通读任务,会发生线程 死锁 ###全局队列 dispatch_get_global_queue() 全局队列,是一个并行队列,可以将队列中的任务放到不同的线程中执行
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ });
####任务执行的优先级 DISPATCH_QUEUE_PRIORITY_HIGH 2 最高 DISPATCH_QUEUE_PRIORITY_DEFAULT 0 中等(默认) DISPATCH_QUEUE_PRIORITY_LOW (-2) 低 DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 后台执行 0,代表线程/线程名
如果在并行队列中同步执行任务,那么这些任务都会在主线程中按顺序执行,也就没有并发性了。
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ });
###自定义队列 ####串行:
dispatch_queue_t serialQueue = dispatch_queue_create("串行队列", DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue, ^{ });
自定义的串行队列,中异步执行任务,队列会把任务放到一个新的线程中按顺序执行 dispatch_queue_t 队列,队列组。 dispatch_queue_create 方法 DISPATCH _QUEUE _SERIAL串行队列
####并行:
dispatch_queue_t concurrentlQueue = dispatch_queue_create("并行队列", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(concurrentlQueue, ^{ });
自定义的并行队列,中异步执行任务,队列会把任务放到不同的线程中执行
DISPATCH _QUEUE _CONCURRENT并行队列
###队列组 // 1、创建一个队列组 dispatch_group_t group = dispatch_group_create();
// 2、创建队列
//自定义队列,并行
dispatch_queue_t queue = dispatch_queue_create("并行队列", DISPATCH_QUEUE_CONCURRENT);
//全局队列,并行
dispatch_queue_t global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 3、在group中异步执行任务
dispatch_group_async(group, queue, ^{});
dispatch_group_async(group,global, ^{});
//这是block方法,如果要改变属性值,需要加__block修饰
4、当group中的任务都执行完后,就会发送一个通知notify调用这个方法
dispatch_group_notify(group, dispatch_get_main_queue(), ^{/*放法*/});
###GCD的一次执行
// 一次执行,block中的代码只能被执行一次,是线程保护的(同时只能一个线程访问),适用于单例
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{ });
###GCD的延迟执行 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{}); ####注意 如果要更新UI,将操作放到主队列中
dispatch_async(dispatch_get_main_queue(), ^{});