UIButton无响应问题详细记录

本文描述了一个自定义AlertView控件的问题,即在更新数据过程中显示的取消按钮无法立即响应点击事件,直到数据更新完成后才响应。通过排查发现是由于主线程中的耗时操作阻塞了UI线程,最终解决方案是将耗时操作移到子线程中执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

自定义了一个AlertView控件,更新数据过程中,显示取消按钮,数据更新完成以后,移除取消按钮,显示完成按钮,在更新数据时,点击取消按钮,在数据更新完成时,按钮才响应。我们的需求就是用户可以取消,但是按钮无响应,导致这个功能无法实现。

思考过程

首先想到的是UI线程被阻塞了,但是我做了错误的测试,只是将显示alertview的代码放到了主线程,这并不是测试主线程的代码,起不到效果;

其次,我想到取消按钮的action是不是没添加成功,检查发现添加成功了;

然后,我尝试使用其他的alertview控件去实现同样的展示效果,但是取消按钮在更新过程中依然无法响应。

再然后,我写了一段测试代码,在子线程中sleep 3s模拟更新过程,之后在主线程更新按钮状态,此时,我发现取消按钮能正常响应。此时问题定位已经定位了80%。我继续查看更新数据的方法,一步步的往深处看执行的方法,发现有一处代码执行时间特别长,但是确在主线程中执行,此刻我恍然大悟,原来更新操作阻塞了主线程,才导致了UIButton无法响应啊!

问题原因

主线程中有耗时操作,block嵌套block,方法体是在子线程中执行,但是block中的代码却是在主线程中;这个问题不容易发现。

block1 ^{
    子线程{
        耗时任务;
        主线程{
            耗时任务;
        }
    }
}

问题衍生

遇到按钮无法响应的问题,首先想想是否主线程被阻塞;

解决方法

将主线程中执行的耗时任务放到子线程中;

block1 ^{
    子线程{
        耗时任务;
        主线程{
            子线程{
                耗时任务;
            }
        }
    }
}

总结

虽然主线程被阻塞了,但是UIImageView的rotateAnimation依然能动画,说明BaseAnimation的执行是在子线程中执行的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值