一、RAC添加方法触发多次
1、问题的描述
表格的cell上添加了按钮,这个按钮添加方法用的是ReactiveCocoa(以下简称RAC)的方法rac_signalForControlEvents
,结果点击按钮的时候容易发生多次触发事件的问题。
2、问题的分析
我们知道cell在移出屏幕时,并没有被销毁,而是被放入重用池中,只有当我们在重用池中取不到的时候才会再创建新的cell。而我们在进入重用池之前,已经添加了按钮的事件方法:[[cell.btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {}];
而我们取出来的cell有很大的可能性是重用池中的,取出来之后又对其进行上述的rac_signalForControlEvents
操作,导致每次重用都会添加一个事件,所以当我们点击按钮时,就会多次触发事件。
3、问题的解决
通过对问题的分析,我们知道只要当每次从重用池中取出cell的时候,终止其按钮之前的事件即可。RAC的操作是基于信号signal的,我们可以使用takeUntil:someSignal
来终止cell上按钮之前的signal。takeUntil:someSignal
的作用是当someSignal sendNext
时,当前的signal就sendCompleted
。someSignal就像一个拳击裁判,哨声响起就意味着比赛终止:
[[[cell.btn rac_signalForControlEvents:UIControlEventTouchUpInside] takeUntil:cell.rac_prepareForReuseSignal]subscribeNext:^(idx) {
// 在此添加按钮的事件
}];
这样就不会多次调用了。
二、防止按钮快速点击造成多次响应
1、问题的描述
通常有些操作是防止用户在一次响应结束中再响应下一个,但有些测试用户就要猛的狂点,像这种恶意的操作,我们要进行预防。
2、问题的解决
当然有些异步操作时,可以在调用前enable 掉。等CallBack 后再enable起来。在这个过程中,按钮是不能点击的。
- (void)todoSomething:(id)sender {
// 在这里做按钮的想做的事情。
}
- (void)starButtonClicked:(id)sender {
// 先将未到时间执行前的任务取消。
[[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(todoSomething:) object:sender];
[self performSelector:@selector(todoSomething:) withObject:sender afterDelay:0.2f];
}
对于这种方法,快速点击N次,只要每次间隔在0.2秒内的都不响应操作,等到停下点击到达0.2秒后再执行。所以按照自己的需要设置响应时间,狂点吧、只响应一次。
网友评论