iOS延时执行 - performSelector

iOS performSelector方法总结 perfromSelector 的非延迟方法 - (id)performSelector:(SEL)aSelector; - (id)performSelector:(SEL)aSelector withObject:(id)object; - (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2; 底层实现 源码地址 - (id)performSelector:(SEL)sel { if 阅读详情

延时执行 - performSelector

performSelector在运行时去动态找方法,在编译时不做校验,所以编译期间不存在这个方法,是不会报错的。但是运行时不存在就会崩溃。为了程序的健壮性,在执行这个方法之前最好做一下判断:

// 判断是否有指定方法
+ (BOOL)respondsToSelector:(SEL)aSelector;

由于这个动态查找方法,可能存在方法不存在的问题,编译器会报警告⚠️, 可以采用下面的方法,让编译器忽略警告:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
          [observer performSelector:info->_action withObject:change withObject:object];
#pragma clang diagnostic pop

1. 同步立刻执行

定义在<NSObject.h>文件中的三个方法,表示当前线程(不分主线程子线程)同步立刻执行方法。

最多只能传2个参数,如果有更多的参数,可以用字典、数组、NSInvocation 包装一下。

- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;

2. 异步延迟执行

定义在<NSRunloop.h>文件中的 NSObject 的2个分类方法,表示当前线程(不分主线程子线程)异步延迟执行方法。

  • 底层会创建一个 Timer,添加到当前线程的运行循环上去执行,可以指定加到什么mode上。
  • 对于主线程来讲,运行循环自动开启,会执行成功。
  • 对于子线程来讲,如果运行循环没开启,则不能执行成功。需要先调用完延迟执行方法后,再调用开启运行循环[[NSRunLoop currentRunLoop]run]; 因为源码逻辑中,开启某线程的Runloop,必须具有timer、source、observer任一事件才能触发开启。
  • 注意:调用该方法所在的 VC 释放时主动调用取消函数,以确保不会内存泄露。
- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray<NSRunLoopMode> *)modes;
- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;

// 取消执行
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullable id)anArgument;
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget;

2.1 应用:防止暴力点击

1. 一段时间内多次点击只响应最后一次

狂点按钮,就会产生多次响应。如果想做到 2 秒内不论点击多少次,都只响应最后一次的话,可以使用延迟执行:

在点击方法内部先取消之前的延迟执行,再触发新一轮的延迟执行。这样在延迟时间 2 秒内的多次点击事件,都可以被取消掉,只响应最后一次。

- (IBAction)buttonClick:(id)sender {
    id params;
    [[self class]cancelPreviousPerformRequestsWithTarget:self
                                                selector:@selector(realResponse:)
                                                  object:params];
    [self performSelector:@selector(realResponse:)
               withObject:params
               afterDelay:2];
}
 
- (void)realResponse:(id)objcet {
    NSLog(@"realResponse");
}

2.点击后,按钮置灰,一段时候后再恢复

-(void)buttonClicked:(id)sender{
  self.button.enabled =NO;
  [selfperformSelector:@selector(changeButtonStatus)withObject:nilafterDelay:1.0f];
}

-(void)changeButtonStatus{
    self.button.enabled =YES;
}

3. 切换线程执行

waitUntilDone参数:

  • YES 表示阻塞当前线程,等待这个方法执行完,再向下执行;
  • NO 表示不等待方法执行完,直接向下执行。
  • 线程执行完任务会立刻销毁

// 去主线程执行方法
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array;
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;

// 去指定线程执行方法
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));

// 开启一个子线程去后台执行方法
- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));

iOS延迟执行的几种方式总结 1.performSelector 2.NSTimer 3.sleep 4.GCD 方法一:performSelector [self performSelector:@selector(delayMethods) withObject:nil afterDelay:1.0]; 分析:该方法是一种非阻塞执行方式,不会影响其他进程;必须在主线程中执行; 可以主动取消操作: [NSObject cancelPreviousPerformRequestsWithTarget:se.. 阅读详情

相关推荐

iOS中常用的延迟执行方法

本文介绍了iOS中常用的几种延迟执行方法,包括dispatch_after、perform(_:with:afterDelay:)和Timer.scheduledTimer(withTimeInterval:repeats:block:)。它接受一个TimeInterval参数,表示延迟的时间,一个Bool参数,表示是否重复执行,以及一个闭包参数,表示要执行的代码块。它接受一个dispatch_time_t参数,表示延迟的时间,以及一个dispatch_queue_t参数,表示要在哪个队列中执行代码。

ByteWhizX的博客 1218

iOS开发——performSelector延时执行注意事项

使用过程中我还发现有时候取消操作不生效,除了要注意selector和object要前后一致之外,其实还有一个要注意的点,就是延时执行和取消延时这两个操作要在同一个线程里面,一般情况下都是在主线程的,但是我有一次就刚好需要在某个网络请求完成之后取消延时,由于延时执行在主线程,网络请求在另一个异步线程里面,所以导致取消失效。要想让取消生效,则需要回到主线程执行取消操作。还有一个方法是可以取消所有performSelector的延时操作。performSelector可以实现延时操作,使用如下。

菜鸟历程 626

详解iOS按钮暴力点击的便捷解决方案

iOS点击事件分类 1.程序中大量按钮没有做连续响应的校验,测试人员连续点击出现了很多不必要的问题,所以只能利用运行时特性,进行hook一下。runtime不能大量使用,但是偶尔使用也是很方便的哈哈。 2.设置单个按钮不需要hook 3.多次点击按钮,只执行最后一次点击事件,忽略前面的点击时间 //// UIButton+touch.h // LiqForDoctors #import#define defaultInterval .5 //默认时间间隔 @interface UIButton (touch) /**设置点击时间间隔*/ @property (nonatomic, as

iOS 【消息处理 performSelector】

消息处理之performSelector

CoderZYWang 1539

若依(RuoYi)框架从零到部署:Spring Boot+Vue权限系统完整配置指南

在Java企业级应用开发中,Spring Boot作为构建微服务和单体应用的基石,极大地简化了项目初始化和配置流程。其核心原理在于通过自动配置和起步依赖,快速整合数据访问、安全认证、缓存等常用模块,显著提升开发效率。这一技术价值在需要快速构建后台管理系统的场景中尤为突出,例如权限管理、用户角色分配等通用需求。若依(RuoYi)框架正是基于Spring Boot和Vue.js的优秀实践,它封装了RBAC权限模型、代码生成器等高频功能,提供了开箱即用的解决方案。本文聚焦于若依框架的【环境配置】与【项目部署】,通

weixin_33984032的博客 455

Oasys安装教程

在基环境下执行然后去 C:\Users.condarc打开 .condarc这个文件 删除干净里面的东西。

weixin_44254178的博客 1295

iOS 延时执行方法 performSelector

[self performSelector:@selector(freshWebviewAtBeginning) withObject:nil afterDelay:0.5];

1049

python电子学会三级的零碎笔记

‌示例‌:如果s = ['a', 'b', 'c'],则' '.join(s)+'\n'的结果是'a b c\n',写入文件时所有元素会在一行内显示,每个元素之间用空格分隔,末尾有一个换行符。(2) '\n'.join(s)‌:如果s = ['a', 'b', 'c'],则'\n'.join(s)的结果是'a\nb\nc',写入文件时每个元素会占据文件的一行。(1) ' '.join(s)+'\n'‌:这种方式首先将列表s中的每个元素通过空格连接成一个字符串,然后在字符串末尾添加一个换行符\n。

xzal12的博客 690

ios nstimer实现延时_iOS中延时执行的几种方式比较及汇总

前言在开发过程中,我们有时会希望把一些操作封装起来延迟一段时间后再执行。本文列举了四种延时执行某函数的方法及其一些区别。假如延时1秒时间执行下面的方法。- (void)delayMethod { NSLog(@"execute"); }1.performSelector方法这是iOS中常用的一种延迟执行方法.//不带参数[self performSelector:@selector(delayDo...

weixin_35152751的博客 432

网络抓包实战:如何捕获与解析802.1Q VLAN标签报文

在网络通信中,数据包是信息传输的基本单元,而VLAN(虚拟局域网)技术通过在数据链路层插入802.1Q标签,实现了网络流量的逻辑隔离与高效管理。其核心原理是在标准以太网帧头中嵌入4字节的VLAN标识,使交换机能够根据VID(VLAN ID)进行精准转发。掌握VLAN报文的捕获与解析技术,对于网络故障排查、安全审计和性能优化具有重要价值,尤其在需要验证网络隔离策略或诊断Trunk链路异常时。本文聚焦于使用Wireshark工具,结合端口镜像等实操方法,详细演示如何抓取并解读携带802.1Q标签的原始报文,帮助

weixin_33417488的博客 381

COMSOL 6.4安装全攻略:安装包获取、许可证配置与避坑指南

多物理场仿真是现代工程与科研中不可或缺的技术手段,其核心原理在于将电磁、结构、流体、传热等不同物理过程的耦合效应置于统一环境中求解,从而真实模拟复杂系统行为。这类仿真平台能大幅提升产品研发与设计验证效率,广泛应用于电子散热、声学分析、电力设备等领域。在部署最新版本仿真软件时,安装与许可证配置往往成为影响工作效率的关键环节。本文系统梳理COMSOL 6.4在Windows平台的安装全流程,涵盖安装包获取、系统依赖准备、许可证配置、常见报错排查等实用经验,帮助工程师与科研人员一次性完成环境搭建,把更多时间投入真

weixin_30000735的博客 1329

iOS 取消延时执行 performSelector: withObject: afterDelay:

- (void)viewDidLoad {     [super viewDidLoad];     // Do any additional setup after loading the view.     //[self setLayout];          [self performSelector:@selector(Test:) wi

zhang_biao_1991的专栏 2349

Spring AI Alibaba实战训练营-20 基于注解驱动的MCP快速开发入门指南

本文详细讲解如何使用SpringAiAlibaba快速开发基于注解驱动的MCP应用。文章详细介绍了MCP协议并且重点介绍了Spring AI通过注解驱动的开发方式简化MCP服务开发。具体包括服务端和客户端的注解使用、城市最新时间查询MCP项目结构概览(服务端和客户端模块)以及环境配置要求。

program哲学 295

iOS之延时执行(睡眠)的几种方法

1. 最直接的方法: [self performSelector:@selector(deleyMethod) withObject:nil afterDelay:1.0];        此方式要求必须在主线程中执行,否则无效。是一种非阻塞的执行方式,暂时未找到取消执行的方法。   缺点:每次要为延时写一个方法。 2. 用 NSTread [NSThread sle

blog_t的博客 4064

基于STM32的智能浇花系统毕业设计(全部资料)

摘要:本文设计了一种基于STM32单片机的智能浇花系统,集成了环境温湿度检测、土壤温湿度监测、LCD显示、Wi-Fi联网及手机APP远程控制等功能。系统通过传感器实时采集环境参数,自动控制水泵工作实现智能灌溉,同时支持用户通过手机APP远程监控和调节。论文详细阐述了硬件选型、软件设计及系统测试过程,验证了系统的稳定性和实用性。该设计为家庭园艺提供了智能化解决方案,具有节水高效、操作便捷等特点。关键词:STM32;智能灌溉;远程控制;环境监测;Wi-Fi通信。

3254968421的博客 1194

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

iOS 四种延时的方法

- (void)initBlock{     //延时的方法     //1:GCD延时 此方式在可以在参数中选择执行的线程。是一种非阻塞的执行方式,没有找到取消执行的方法。     double delay1=2.0;//设置延时时间     dispatch_time_t popTime=dispatch_time(DISPATCH_TIME_NOW, delay1 * NSEC_PE

darongzi1314的专栏 1120

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

html中如何让方法延迟执行一次,iOS延时执行的四种方法

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter....

weixin_34118050的博客 762

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ios nstimer实现延时_IOS中延时执行的几种方式的比较和汇总

本文列举了四种延时执行某函数的方法及其一些区别。假如延时1秒时间执行下面的方法。-(void)delayMethod{NSLog(@"execute");}1.performSelector方法[selfperformSelector:@selector(delayMethod)withObject:nilafterDelay:1.0f];此方式要求必须在主线程中执行,否则无效。是一...

weixin_39714275的博客 135

iOS 延时执行的方法

iOS延时执行的四种方法#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view,

Ashimar_ZHZ的博客 892

IOS中延时执行的几种方式的比较和汇总

IOS中延时执行的几种方式的比较和汇总 2014-04-29 10:10 7694人阅读 评论(0) 收藏 举报 转载自:http://blog.sina.com.cn/s/blog_8280f5ec0101k03c.html 本文列举了四种延时执行某函数的方法及其一些区别。假如延时1秒时间执行下面的方法。 - (void)delayMethod { NSLog(@"e

X_FOCUS的专栏 1316

iOS 中延时执行的几种方式的比较和汇总

1.performSelector方法   [self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.0f];   此方式要求必须在主线程中执行,否则无效。   是一种非阻塞的执行方式,   暂时未找到取消执行的方法 2.定时器:NSTimer   [NSTimer scheduledT...

dianfeiil764936的博客 157

iOS中延时执行(睡眠)的几种方法

1. 最直接的方法: [self performSelector:@selector(deleyMethod) withObject:nil afterDelay:1.0]; 此方式要求必须在主线程中执行,否则无效。是一种非阻塞的执行方式,暂时未找到取消执行的方法。 缺点:每次要为延时写一个方法。 2. 用 NSTread[NSThread sleepForTimeInterval:0.0

yuedong56的专栏 1万+

iOS performSelector

在项目中,常常用到performSelectorXXX之类的方法,而且有很多类似方法;今天就来召集一下! 1.performSelectorOnMainThread:withObject:waitUntilDone: - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUnt

After17_Chen的博客 514

ios 线程休眠_iOS中常用的线程睡眠方法

1.直接写延时[self performSelector:@selector(deleyMethod) withObject:nil afterDelay:1.0];此方式要求必须在主线程中执行,否则无效。是一种非阻塞的执行方式,暂时未找到取消执行的方法。缺点:每次要为延时写一个方法。2. 用 NSTread线程睡眠[NSThread sleepForTimeInterval:1.0];此方式在主...

weixin_30725829的博客 1285
上一篇: 掌握了java锁的原理机制后其实变得很简单,难的是运用到各种业务的场景
下一篇: Java面向对象总结
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值