iOS 限制按钮的点击频率(Target-Action设计模式的运用)

原创
2021/09/13 00:00
阅读数 354

引言

在项目开发中,会对数据库数据进行更新操作的接口请求,不仅服务器侧需要控制请求频率以及保证数据的唯一性和一致性,app侧也需要进行限制来避免产生垃圾数据

常用的方案有

1、限制按钮的点击频率: 针对注册类接口的时间间隔timeInterval可设置长些,推荐0.5s 

2、新增标志对单个接口进行请求频率的控制


/**
 控制接口的请求标志
 */

@property (assignnonatomicBOOL IsreqingGetCurrentSysUser;


I、限制按钮的事件响应频率

公众号:iOS逆向

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 代码实现

公众号:iOS逆向

本文案例是采用分类的形式,你可以选择自定义控件的方式进行实现

头文件

#import <UIKit/UIKit.h>

#define defaultInterval .2  //默认时间间隔
@interface UIButton (touch)
/**设置点击时间间隔*/
@property (nonatomicassignNSTimeInterval timeInterval;
@end

从原文https://kunnan.blog.csdn.net/article/details/117352527查看完整部实现

1.3 使用和测试

使用:由于采用分类在UIButton的load进行方法交换,因此只要项目包含分类文件即可 测试:快速多次点击按钮

公众号:iOS逆向
//一根或者多根手指离开view,系统会自动调用view的下面方法
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;

II、知识储备:什么是响应者链?

iOS触摸事件:什么是响应者链?

https://kunnan.blog.csdn.net/article/details/74107917

iOS Target-Action设计模式的运用

https://kunnan.blog.csdn.net/article/details/108011011

see also

更多相关内容请关注公众号:iOS逆向

iOS Target-Action设计模式的运用【修订】

本文分享自微信公众号 - iOS逆向(code4ios)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部