Swift4.2 封装商城活动倒计时WMCountDown

作为一个传统的iOS开发者,艰难的从Objective-C转到Swift,尤其从面向对象编程转变为面向协议编程,此中艰辛,同道中人深有体会。

之前也有用过Swift3.0写过小项目练练手,但已事隔一年多了,忘到提起Swift大脑一片空白的状态。之前所累积封装的工具类、控件在目前的Swift项目中无法使用,现在要遇到通用的代码都需要重新封装。

项目是类似商城的App,不细说,毕竟主题不是项目,项目首页需要展示一个商城活动的倒计时,接收服务器传来的开始时间与结束时间,展示二者的时间差倒计时,所以就封装了倒计时WMCountDown。

第一次,废话有点多,不多说,先上效果图:

image

采用DispatchSourceTimer定时器,比起Timer优点就不多说,在gloal线程中执行,进入控制器开始计时,离开控制器停止计时,努力使用最小开销。在Cell中不会随着TableView的滚动而暂停计时。

在ViewController中使用方法:


  /// 懒加载 倒计时

    lazy var countdownTimer: WMCountDown = {

        let timer = WMCountDown()

        // 此闭包可以在本类任意方法中写

        timer.countDown = { [weak self] (d, h, m, s) in

            self?.dayLabel.text = "\(d)天:"

            self?.hourLabel.text = "\(h)时:"

            self?.minuteLabel.text = "\(m)分:"

            self?.secondLabel.text = "\(s)秒"

        }

        return timer

    }()

    override func viewWillAppear(_ animated: Bool) {

        super.viewWillAppear(animated)

        countdownTimer.resume() // 恢复倒计时

    }

    override func viewWillDisappear(_ animated: Bool) {

        super.viewWillDisappear(animated)

        countdownTimer.suspend() // 停止倒计时

    }

    override func viewDidLoad() {

        super.viewDidLoad()

        // 开始倒计时

        // 可以传递开始时间参数,用于计算倒计时时间差,不传默认从系统当前时间开始计算时间差

        // countdownTimer.start(with: "2018-12-17 22:49:00", end: "2018-12-19 22:49:00")

        countdownTimer.start(with: nil, end: "2019-12-19 22:49:00")

    }

    deinit {

        /// 可写可不写

        countdownTimer.stop()

    }

TableViewCell 使用方法:


class CountDownCell:UITableViewCell{

     let countDownTimer =WMCountDown()

    override func awakeFromNib() {

        super.awakeFromNib()

        countDownTimer.countDown= { [weak self ] (d, h, m, s) in

            let time = d +":"+ h +":"+ m +":"+ s

            self?.textLabel?.text= time

            print("时间是:\(d):\(h):\(m):\(s)")

        }

        // 开始倒计时

        // 可以传递开始时间参数,用于计算倒计时时间差,不传,默认从系统当前时间开始计算时间差

        // countdownTimer.start(with: "2018-12-17 22:49:00", end: "2018-12-19 22:49:00")*

        let minute =randomInRange(range: (1..<60))

        let second =randomInRange(range: (1..<60))

        countDownTimer.start(with: nil, end:"2019-12-19 22:\(minute):\(second)")

    }

    deinit  {

        countDownTimer.stop()

    }

}

GitHub:WMCountDown

如果对您有帮助,甚感欣慰~

你可能感兴趣的:(Swift4.2 封装商城活动倒计时WMCountDown)