前言
在iOS开发中,有几个实际业务场景需要控制 UIButton 响应事件的时间间隔:
- 当点击按钮后会执行网络请求时,若请求耗时稍长,用户往往会再点一次。这样,就执行了两次请求,造成了资源浪费。
- 当移动终端性能较差时,连续点击按钮会执行多次事件(比如 push 出来多个viewController)。
- 防止用户暴力点击,不停的点击。
方案
控制 UIButton 响应事件时间间隔的方案不止一种。
方案一:
- (void)buttonAction:(UIButton *)btn
{
btn.enabled = NO;
//TODO:...
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
btn.enabled = YES;
});
}
这个方案在逻辑上比较清晰、易懂,但代码分散,常常涉及多个方法,多个状态,多种判断,耦合严重。
方案二:
- (void)buttonAction:(UIButton *)btn
{
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(buttonClickedAction:)