美文网首页
按钮添加方法触发多次

按钮添加方法触发多次

作者: Miss_QL | 来源:发表于2018-02-26 15:04 被阅读134次

    一、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秒后再执行。所以按照自己的需要设置响应时间,狂点吧、只响应一次。

    相关文章

      网友评论

          本文标题:按钮添加方法触发多次

          本文链接:https://www.haomeiwen.com/subject/roryxftx.html