Swift 相关

Swift多事件延时计时器触发

2018-12-16  本文已影响17人  怀心逝水

应用场景:事件的多次触发后,事件在每隔0.25秒执行显示动画。(例如,当我们在友盟推送消息后,我们会在APP的界面上显示提示横幅。)

还是先看效果图吧!


TimerThread.gif

好的,如果你有兴趣看下去的话,咋们来看看,这个demo的思路是什么。

知识点:

1.swift的基础知识(布局,创建控件,图层获取等)
2.定时器的用法,当然我这里是创建线程来处理的,至于你如果想看看其他的几种定时器的用法,可以点击
传送门
3.实现逻辑,在主线程中消失视图动画完成之后再去执行block回调,之后根据消息数组是否为空,重复执行显示视图动画。

部分代码解读:


    @IBAction func clickBtnDidTouch(_ sender: UIButton) {
        
        if msgArray.count == 0 {
            
            clickNum = 0
            index = 1
        }
        clickNum = clickNum + 1
        if msgArray.count != 0 {
            
            msgArray.append("显示信息" + String(clickNum))
        }else {
            
            msgArray.append("显示信息" + String(clickNum))
            solveMsgPushShow(index: index)
        }
    }

可以看到在ViewController中的msgArray是储存新消息的数组,下面的solveMsgPushShow连续的点击中只会执行一次,而添加消息会一直执行的。


    func solveMsgPushShow(index: NSInteger) {
        
        let msg = msgArray.first
        if msg != nil {
            
            Helper.showPushInfo(msg: msg!, ofTag: index) {
                
                if self.msgArray.count != 0 {
                    
                    self.msgArray.removeFirst()
                }
                
                if self.msgArray.count == 0 {
                    
                    return
                }else {
                    
                    self.index = self.index + 1
                    self.solveMsgPushShow(index: self.index)
                }
            }
        }
    }

这个方法就是根据数组中的消息是否为空,而去执行显示和消失动画,这里的index是创建控件时,区分创建的控件的tag,从而在消除控件的时候方便的获取需要消除的控件。

        UIView.animate(withDuration: 0.3, animations: {  //显示动画
            
            label.bottomY = SCREEN_HEIGHT - 20
            button.topY = 30
        }) { (finish) in
            
            DispatchQueue.main.asyncAfter(deadline: .now() + 2.5, execute: {     // 线程延时器
                
                DispatchQueue.main.async {     // 获取主线程
                    
                    dismissPushInfoOfTag(index: index, completeBlock: completeBlock)
                }
            })
        }

显示动画,用定时器让控件在主界面上停留一段时间,之后我们需要获取主线程执行控件的消失动画

        UIView.animate(withDuration: 0.3, animations: {  //消失动画
            
            label?.topY = SCREEN_HEIGHT
            button?.bottomY = 0
        }) { (finish) in
            
            label?.removeFromSuperview()
            button?.removeFromSuperview()
            
            if completeBlock != nil {
                
                completeBlock!()
            }
        }

消失动画,这里我们在消失动画执行完毕之后,去除控件,然后执行回调方法。这样我们在ViewController中获取到回调的block后再去根据msgArray是否为空执行下一次消息的显示和消失动画。

好的,基本思路就是这些了。希望你看了之后,对你遇到的问题有些帮助!!!

最后还是给出这个demo的GitHub地址吧

TimerThread

上一篇下一篇

猜你喜欢

热点阅读