引言
在项目开发中,会对数据库数据进行更新操作的接口请求,不仅服务器侧需要控制请求频率以及保证数据的唯一性和一致性,app侧也需要进行限制来避免产生垃圾数据
常用的方案有
1、限制按钮的点击频率: 针对注册类接口的时间间隔timeInterval可设置长些,推荐0.5s
2、新增标志对单个接口进行请求频率的控制
/** 控制接口的请求标志 */ @property (assign, nonatomic) BOOL IsreqingGetCurrentSysUser;
I、限制按钮的事件响应频率
1.1 原理分析
原理:利用runtime API 对UIControl方法sendAction:to:forEvent:
进行方法实现的交换,来控制事件的响应频率
SEL selA = @selector(sendAction:to:forEvent:);
如果按钮的事件处理采用添加UITapGestureRecognizer 手势的实现的,同理也是可以类似地进行Method Swizzling实现响应频率的限制
UITapGestureRecognizer *cutTap = [[UITapGestureRecognizer alloc] init]; [[cutTap rac_gestureSignal] subscribeNext:^(id x) { NSLog(@" cutTap 点击了 "); if ( self.models.block) { self.models.block(self.models); } }]; [self addGestureRecognizer:cutTap];
倒计时巧妙地使用performSelector:withObject:afterDelay:
实现
[self performSelector:@selector(resetState) withObject:nil afterDelay:self.timeInterval];//
1.2 代码实现
本文案例是采用分类的形式,你可以选择自定义控件的方式进行实现
头文件
#import <UIKit/UIKit.h> #define defaultInterval .2 //默认时间间隔 @interface UIButton (touch) /**设置点击时间间隔*/ @property (nonatomic, assign) NSTimeInterval timeInterval; @end
从原文https://kunnan.blog.csdn.net/article/details/117352527查看完整内部实现
1.3 使用和测试
使用:由于采用分类在UIButton的load进行方法交换,因此只要项目包含分类文件即可 测试:快速多次点击按钮
//一根或者多根手指离开view,系统会自动调用view的下面方法 - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
II、知识储备:什么是响应者链?
iOS触摸事件:什么是响应者链?
iOS Target-Action设计模式的运用