OC:四种延时触发的方式
方式 四种 触发 延时 OC
2023-09-27 14:27:09 时间
方式一(performSelector)
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0]
取消要执行的方法,有点像 clearTimeout
[NSObject cancelPrevIoUsPerformRequestsWithTarget:self selector:@selector(myMethod) object:nil];
方式二(NSTimer)
// NO表示只调用一次,YES表示循环调用
_timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(delayAction) userInfo:nil repeats:NO];
-(void)delayAction
{
NSLog(@"qqqqqqqqqq");
}
在页面销毁的时候要把Timer也销毁掉以免内存泄漏:
_timer = nil;
[_timer invalidate];
系统没有为NSTimer提供取消延迟执行的方法,即使把Timer销毁掉,延迟的方法依然会执行。但是我们可以在延迟执行的方法内加一个判断来控制是否执行:
if (_timer) {
NSLog(@"delay action");
}
方式三(GCD)
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self delayAction];
});
通过dispatch_after同样无法取消延迟执行的方法,可是参照着timer的思路,我们同样可以自己设置一个标记来控制延迟执行的操作:
设置一个BOOL值初始值为NO:
@property (nonatomic, assign) BOOL isDelay;
延迟操作:
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self delayAction];
});
要延迟的方法内部:
if (_isDelay == NO) {
NSLog(@"delay action");
}
这样便可通过设置 isDelay = YES; 来取消延迟操作了。
方式四(NSThread)
把当前线程进入睡眠状态,到时间后自动唤醒,继续往下执行,但并不能主动进行唤醒操作。
[NSThread sleepForTimeInterval:2];
参考文档
https://blog.csdn.net/liu1347508335/article/details/52352848
相关文章
- 多表连接的三种方式详解 HASH JOIN MERGE JOIN NESTED LOOP
- C# 字符串拼接性能探索 c#中+、string.Concat、string.Format、StringBuilder.Append四种方式进行字符串拼接时的性能
- 深度学习四种不同归一化方式对比zz
- 软件测试人员的思维方式
- Mybatis-plus之四种lambda方式
- C++ 创建文件夹的四种方式
- Android开发的之基本控件和详解四种布局方式
- Struts2访问request,session,application的四种方式
- Storyboard中ViewController加载的四种方式
- Vue动态加载组件的四种方式
- JAVA多线程实现的四种方式
- application/json 四种常见的 POST 提交数据方式
- ingress 代理方式
- Oracle中Basic与TNS的区别及与Oracle三种连接方式的关系
- 简述数据中心四种数据备份方式
- 中小企业IT手册 四种方式提升云安全
- 【spring框架】bean属性注入方式
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍--转载
- 接口 C#/Java 请求数据 raw 的方式传输复杂对象
- 四种常见的Web攻击手段及其防御方式
- 算法补天系列之有序表的四种实现方式——AVL树,SB树,红黑树,跳表(重点)介绍说明