首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

iOS开发基础136-防暴力点击

编程知识
2024年07月23日 13:37

要在Objective-C中创建一个高度可复用的工具类,以防止按钮的暴力点击,并且使用切面编程(AOP)的方式,我们可以考虑使用Aspects这个库来实现方法的拦截。以下是具体的实现步骤:

第一步:引入Aspects库

首先,需要将Aspects集成到项目中。Aspects是一个轻量级的AOP框架,允许你在运行时拦截类的实例方法和类方法。你可以通过CocoaPods来添加此库:

pod 'Aspects'

第二步:创建UIButton的Category

接下来,创建一个UIButton的Category,用于添加防暴力点击的逻辑。

UIButton+PreventSpam.h:

#import <UIKit/UIKit.h>

@interface UIButton (PreventSpam)

// 设置间隔时间,进行防暴力点击设置
- (void)setPreventSpamInterval:(NSTimeInterval)interval;

@end

UIButton+PreventSpam.m:

#import "UIButton+PreventSpam.h"
#import <objc/runtime.h>
#import <Aspects/Aspects.h>

static const char *UIButton_preventSpamIntervalKey = "UIButton_preventSpamIntervalKey";

@implementation UIButton (PreventSpam)

- (void)setPreventSpamInterval:(NSTimeInterval)interval {
    objc_setAssociatedObject(self, UIButton_preventSpamIntervalKey, @(interval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    // 使用Aspects进行方法拦截
    [self aspect_hookSelector:@selector(sendAction:to:forEvent:) withOptions:AspectPositionInstead usingBlock:^(id<AspectInfo> aspectInfo, SEL action, id target, UIEvent *event) {
        UIButton *button = aspectInfo.instance;
        if (button.isIgnoring) {
            return;
        }
        button.isIgnoring = YES;

        // 执行原始的 sendAction:to:forEvent: 方法
        // 这里直接调用原始方法是不合适的,因为这是一个拦截后的block,我们要重新invoke original invocation
        [[aspectInfo originalInvocation] invoke];
        
        // 延迟间隔时间后,重置为可以点击
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(interval * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            button.isIgnoring = NO;
        });
    } error:NULL];
}

// 判断当前是否应该忽略点击,通过关联对象添加属性
- (void)setIsIgnoring:(BOOL)isIgnoring {
    objc_setAssociatedObject(self, @selector(isIgnoring), @(isIgnoring), OBJC_ASSOCIATION_ASSIGN);
}

- (BOOL)isIgnoring {
    return [objc_getAssociatedObject(self, @selector(isIgnoring)) boolValue];
}

@end

使用

在适当的位置设置按钮的点击间隔:

#import "UIButton+PreventSpam.h"

[myButton setPreventSpamInterval:1.0]; // 点击间隔设置为1秒

注意

  1. 本示例使用了Aspects库进行方法的拦截,这是一种运行时AOP的技巧。这里利用了Objective-C的动态特性。AOP可以帮助增加代码的可维护性和可复用性,但它也会增加代码的复杂性,使用时需要权衡。

  2. 使用关联对象(objc_setAssociatedObjectobjc_getAssociatedObject)来给UIButton动态添加属性,用于存储是否应该忽略点击和间隔时间,这是Objective-C扩展现有类功能的常用技巧。

  3. 在实际项目中,可能需要考虑多种情况和细节,如处理快速切换界面时按钮点击事件的响应等。

From:https://www.cnblogs.com/chglog/p/18318351
本文地址: http://shuzixingkong.net/article/325
0评论
提交 加载更多评论
其他文章 App如何利用推送消息有效实现拉新促活?
对于大多数App来说,如何快速建立与用户的联系、提高用户活跃度、提升用户转化率,是产品运营过程中十分关心的问题,在常见的运营手段中,Push推送消息以其高性价比成为首选策略。但在实际运营过程中,推送消息的打开率和转化率远远达不到预期,App日活难以提升。那么如何才能有效提高打开和转化率,快速实现Ap
App如何利用推送消息有效实现拉新促活? App如何利用推送消息有效实现拉新促活? App如何利用推送消息有效实现拉新促活?
OLOR:已开源,向预训练权值对齐的强正则化方法 | AAAI 2024
随着预训练视觉模型的兴起,目前流行的视觉微调方法是完全微调。由于微调只专注于拟合下游训练集,因此存在知识遗忘的问题。论文提出了基于权值回滚的微调方法OLOR(One step Learning, One step Review),把权值回滚项合并到优化器的权值更新项中。这保证了上下游模型权值范围的一
OLOR:已开源,向预训练权值对齐的强正则化方法 | AAAI 2024 OLOR:已开源,向预训练权值对齐的强正则化方法 | AAAI 2024 OLOR:已开源,向预训练权值对齐的强正则化方法 | AAAI 2024
深入理解Spring Boot:Bean管理、原理解析与Maven高级应用
深入理解Spring Boot:Bean管理、原理解析与Maven高级应用 前言 大家好,今天我们来聊聊Spring Boot的核心内容,包括Bean管理、Spring Boot的工作原理以及Maven的高级应用。这些内容不仅是Spring Boot的基础,也是我们在实际项目中经常会遇到的问题。希望
SQL 注入漏洞详解 - Union 注入
1)漏洞简介 SQL 注入简介 SQL 注入 即是指 Web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 Web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应
SQL 注入漏洞详解 - Union 注入 SQL 注入漏洞详解 - Union 注入 SQL 注入漏洞详解 - Union 注入
约数和倍数的性质
约数(Divisors) 约数是指能整除某个整数的其他整数。例如,对于整数 ( a ),如果存在整数 ( b ) 使得 ( a = b*c ),那么 ( b ) 就是 ( a ) 的约数。 性质: 1 和自身是每个整数的约数: 每个整数 ( a ) 都有至少两个约数:1 和 ( a ) 本身。 约数
JVM系列(一) -浅谈虚拟机的成长史
一、摘要 众所周知,Java 经过多年的发展,已经从一门单纯的计算机编程语言,发展成了一套成熟的软件解决方案。从互联网到企业平台,Java 是目前使用最广泛的编程语言。 以下这段内容是来自 Java 的官方介绍! 从笔记本电脑到数据中心,从游戏控制台到科学超级计算机,从手机到互联网,Java 无处不
JVM系列(一) -浅谈虚拟机的成长史 JVM系列(一) -浅谈虚拟机的成长史 JVM系列(一) -浅谈虚拟机的成长史
scanf、cin及其优化、快读性能测试
为了让大家了解C++各种IO方式的性能,于是就有了这篇文章。 本次测试采取的数据均为 \(10^6\) 个不超过 \(10^8\) 随机正整数。 测试代码: #include&lt;bits/stdc++.h&gt; using namespace std; int x; int main(){ f
scanf、cin及其优化、快读性能测试 scanf、cin及其优化、快读性能测试 scanf、cin及其优化、快读性能测试
第一作者解读|我们这篇Nature Communication背后的故事
2024年7月16日,大暑将至,立秋不远。我们基于Python的转录组学全分析框架的文章——&quot;OmicVerse: a framework for bridging and deepening insights across bulk and single-cell sequencing&
第一作者解读|我们这篇Nature Communication背后的故事 第一作者解读|我们这篇Nature Communication背后的故事 第一作者解读|我们这篇Nature Communication背后的故事