RxSwift 倒计时按钮

class MainViewController: UIViewController {

    let disposeBag = DisposeBag()
    var timeStr: String? = "点击发送" {
        didSet {
            if timeStr == "重新发送" {
                self.timeButton.setTitle(timeStr, for: .normal)
                self.timeButton.setTitleColor(UIColor.black, for: .normal)
                self.timeButton.isEnabled = true
            } else {
                self.timeButton.setTitle(timeStr, for: .normal)
                self.timeButton.setTitleColor(UIColor.lightGray, for: .normal)
                self.timeButton.isEnabled = false
            }
        }
    }
    var countdown: Int = 60 {
        didSet {
            timeStr = String(format: "%d秒后重发", countdown)
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .white
        
        view.addSubview(timeButton)
        timeButton.snp.makeConstraints { (make) in
            make.width.equalTo(100)
            make.height.equalTo(40)
            make.center.equalTo(view.snp.center)
        }
        // Do any additional setup after loading the view.
    }

    func countdownTimer(second: Int, immeiately: Bool = true, duration: ((Int) -> Void)?) -> Single<Void> {
        guard second > 0 else { return Single<Void>.just(())}
        if immeiately {
            duration?(second)
        }
        return Observable<Int>.interval(RxTimeInterval.seconds(1), scheduler: MainScheduler.instance)
            .map{ second-(immeiately ? ($0 + 1) : $0) }
            .take(second+(immeiately ? 0 : 1))
            .do(onNext: { (index) in
                duration?(index)
            })
            .filter{ return $0 == 0 }
            .map{_ in return () }
            .asSingle()
    }

    @objc func clickButton() {
        countdownTimer(second: 60) {[weak self] (index) in
            guard let self = self else { return }
            self.countdown = index
            debugPrint("倒计时: \(index)")
        }.subscribe {[weak self] () in
            guard let self = self else { return }
            self.timeStr = "重新发送"
            debugPrint("倒计时结束")
        } onFailure: { (error) in
            debugPrint("倒计时错误:\(error)")
        }.disposed(by: disposeBag)
    }

    lazy var timeButton: UIButton = {
        let button = UIButton(type: .custom)
        button.setTitle(self.timeStr, for: .normal)
        button.setTitleColor(UIColor.black, for: .normal)
        button.addTarget(self, action: #selector(clickButton), for: .touchUpInside)
        return button
    }()

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值