iOS按钮防重,在Release和Debug环境下表现不一致的问题

背景

项目中需要用到按钮防重,按照网上搜索的方法,重写UIControl方法,在Debug下没问题,发布到产线后,用户反馈按钮点击一次之后再也无法点击。

分析

image.png

修改 XcodeSchemeRun 模式为 Release后连接手机编译,重现此问题。经过分析,发现是 performSelector:withObject:afterDelay这个方法在 ReleaseDebug 模式下,对于@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];

    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容