GCD高级功能(一次性执行,调度组,延迟操作)
来源:互联网 发布:优化百度 编辑:程序博客网 时间:2024/06/10 06:18
GCD的三大高级功能:一次性执行,调度组,延迟操作
一次性执行
一次性执行 : 可以保证某一段代码在程序运行的过程中只被执行一次
一次性执行是线程安全的,在多线程环境下也是只执行一次
应用场景 : 设计单例模式.(效率比互斥锁高)
可以保证程序在运行的过程中,一个类有且只有一个实例化的对象,而且该对象易于供外界访问
可以节省内存资源
/// 验证安全性 : 线程安全- (void)onceDemo2{ for (int i = 0; i < 1000; i++) { NSLog(@"点击屏幕....."); dispatch_async(dispatch_get_global_queue(0, 0), ^{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSLog(@"hello"); }); }); }}/// 一次性执行 : 保证代码制备执行一次- (void)onceDemo1{ NSLog(@"点击屏幕...."); static dispatch_once_t onceToken; // 原理 : 第一次执行时候,onceToken的初始值是0.当检测到初始值是0的时候,就执行一次性执行的代码.执行完成之后,将onceToken的初始值设置为非零的. NSLog(@"%ld",onceToken); dispatch_once(&onceToken, ^{ NSLog(@"hello"); });}
单例设计模式
声明一个类.h文件
#import <Foundation/Foundation.h>@interface AppUntil : NSObject/// 实例化的类方法+ (instancetype)sharedAppUntil;- (void)loadData;@end
类的.m文件
#import "AppUntil.h"/* 1. 有一个供全局实例化的方法 2. 在内存中有且只有一个实例化的对象 3. 生命周期跟应用程序一样长 */@implementation AppUntil+ (instancetype)sharedAppUntil{ static AppUntil *instance; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[AppUntil alloc] init]; }); return instance;}- (void)loadData{ NSLog(@"下载中.....");}
单例的应用:
- (void)viewDidLoad { [super viewDidLoad]; //创建三个对象--这种创建的三个对象,是三个不同的对象,开辟了三个空间 AppUntil *until1 = [[AppUntil alloc] init]; NSLog(@"%@",until1); AppUntil *until2 = [[AppUntil alloc] init]; NSLog(@"%@",until2); AppUntil *until3 = [[AppUntil alloc] init]; NSLog(@"%@",until3);}
三个地址一样 AppUntil *until1 = [AppUntil sharedAppUntil]; NSLog(@"%@",until1); AppUntil *until2 = [AppUntil sharedAppUntil]; NSLog(@"%@",until2); AppUntil *until3 = [AppUntil sharedAppUntil]; NSLog(@"%@",until3); [[AppUntil sharedAppUntil] loadData];
调度组
调度组特点 : 一组异步任务执行结束之后,我们能够得到统一的通知
比如下载一组图片,等所有的图片都下载完毕之后 转到 主线程更新UI.
调度组原理
//1 全局队列 dispatch_queue_t queue = dispatch_get_global_queue(0, 0); //2 调度组 dispatch_group_t group = dispatch_group_create(); //3 添加任务 //把任务添加到队列,等任务执行完成之后通知调度组 dispatch_group_async(group, queue, ^{ NSLog(@"下载图片1 %@",[NSThread currentThread]); }); dispatch_group_async(group, queue, ^{ NSLog(@"下载图片2 %@",[NSThread currentThread]); }); dispatch_group_async(group, queue, ^{ NSLog(@"下载图片3 %@",[NSThread currentThread]); }); //4 所有任务都执行完成后,获得通知 (异步执行) //等调度组中队列的任务完成后,把block添加到指定的队列// dispatch_group_notify(group, queue, ^{// NSLog(@"OK %@",[NSThread currentThread]);// }); dispatch_group_notify(group, dispatch_get_main_queue(), ^{//更新UI控件,提示用户 NSLog(@"OK %@",[NSThread currentThread]); }); NSLog(@"over");
调度组原理
在终端中 输入man dispatch_group_async//1 全局队列 dispatch_queue_t queue = dispatch_get_global_queue(0, 0); //2 调度组 dispatch_group_t group = dispatch_group_create(); //ARC中不用写// dispatch_retain(group); //3 进入调度组,执行此函数后,再添加的异步执行的block都会被group监听 dispatch_group_enter(group); //4 添加任务 dispatch_async(queue, ^{ NSLog(@"!!--!!"); dispatch_group_leave(group); //ARC中此行不用写,也不能写// dispatch_release(group); }); dispatch_group_enter(group); dispatch_async(queue, ^{ NSLog(@"!!------!!"); dispatch_group_leave(group); //ARC中此行不用写,也不能写 //dispatch_release(group); }); //5 获得调度组的通知 dispatch_group_notify(group, dispatch_get_main_queue(), ^{ NSLog(@“OK %@",[NSThread currentThread]); });//6 等待调度组 监听的队列中的所有任务全部执行完毕,才会执行后续代码,会阻塞线程(很少使用) dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
延迟操作
/延时操作 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ });• dispatch_after的定义dispatch_after(dispatch_time_t when,dispatch_queue_t queue,dispatch_block_t block); • dispatch_after的参数参数1 dispatch_time_t when多少纳秒之后执行参数2 dispatch_queue_t queue任务添加到那个队列参数3 dispatch_block_t block要执行的任务
0 0
- GCD高级功能(一次性执行,调度组,延迟操作)
- GCD的调度组和延迟执行、一次性执行
- GCD之——延迟执行、调度组、以及一次性执行代码
- GCD线程组、一次性执行和稍后执行
- iOS 开发 多线程详解之GCD应用延迟操作,单例设计模式,调度组
- ios多线程操作(七)—— GCD延迟操作与一次性代码
- ios多线程操作(七)—— GCD延迟操作与一次性代码
- GCD延迟执行
- IOS开发(63)之GCD执行延迟操作
- GCD 实现延迟一段时间执行
- lambda高级进阶--延迟执行
- iOS:GCD进行延迟执行任务
- iOS--多线程GCD延迟执行--07
- Unity3D延迟执行功能脚本
- ios多线程操作(八)—— GCD调度组
- ios多线程操作(八)—— GCD调度组
- GCD—调度组
- GCD常见的几种用法-- 延迟\一次性代码\多线程同时遍历\栈栏
- iOS const和static详解
- lua 点号"."和冒号":"、"seif"使用及区别
- Mecanim Control
- NYOJ:255 C小加 之 随机数(unique函数)
- 对话框版本低导致异常退出
- GCD高级功能(一次性执行,调度组,延迟操作)
- windows下vs2010 编译live555源码库的环境搭建
- CSS文档规范
- 苹果原生框架分享 ----- Social
- android RSA加密的使用
- NSAssert()
- 实现单张图片的倒影效果
- 343. Integer Break
- FileReader搭配FileWriter,更新对抛出的机制做回应