IOS多线程之GCD

#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(), ^{});

转载于:https://my.oschina.net/zhenghaoLi/blog/741984

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值