背景
项目中需要用到按钮防重,按照网上搜索的方法,重写UIControl
方法,在Debug
下没问题,发布到产线后,用户反馈按钮点击一次之后再也无法点击。
分析
修改 Xcode
的 Scheme
中 Run
模式为 Release
后连接手机编译,重现此问题。经过分析,发现是 performSelector:withObject:afterDelay
这个方法在 Release
和 Debug
模式下,对于@YES
和@NO
的传递结果不一样。Debug
传值符合预期,Release
传值超出预期!!!
改进
直接使用dispatch_after
,它里面的定时器不受runLoop
影响的
- (void)__uxy_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event{
// if (self.ignoreEvent) return;
//
// if (self.uxy_acceptEventInterval > 0){
// self.ignoreEvent = YES;
// [self performSelector:@selector(setIgnoreEvent:) withObject:@(NO) afterDelay:self.uxy_acceptEventInterval];
// }
// //调用系统实现
// [self __uxy_sendAction:action to:target forEvent:event];
if (self.ignoreEvent == NO) {
if(self.uxy_acceptEventInterval>0){
self.ignoreEvent = YES;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.uxy_acceptEventInterval*NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.ignoreEvent = NO;
});
}
[self __uxy_sendAction:action to:target forEvent:event];
}
}