Swift实现倒计时5秒功能
一般在项目的“引导页”有个功能,倒计时5秒结束后,然后可以允许用户点击跳过按钮跳过引导页。同样在“登录”和“注册”页面也有类似功能,发送验证码后,计时60秒后才允许用户再次请求重新发送验证码。
计时方式一(sleep+performSelector)
通过调用sleep(1)阻塞线程的方式来达到目的
importUIKit classGAPublishViewController:GABaseViewController{ varjumpBut=UIButton(frame:CGRect(x:15,y:64,width:80,height:40)); varlimitTime:Int=5+1; overridefuncviewDidLoad(){ super.viewDidLoad() setupJumpButton(); startCountDown(); } funcsetupJumpButton(){ view.addSubview(jumpBut); jumpBut.setTitle("跳过(5S)",for:.normal); jumpBut.setTitleColor(UIColor.red,for:.normal); jumpBut.addTarget(self,action:#selector(tapJumpAction(sender:)),for:.touchUpInside); } @objcfunctapJumpAction(sender:Any){ letbut=senderas!UIButton; lettext=but.titleLabel?.text??""; if(text=="跳过"){ print("点击“跳过”"); } } //MARK:定时方式一 funcstartCountDown(){ performSelector(inBackground:#selector(countDownThread),with:nil) } @objcfunccountDownThread(){ lettimeCount=limitTime; for_in0..计时方式二(sleep+GCD)
与上面的方式一类似
//MARK:定时方式二 funcstartCountDown(){ //将任务添加到队列,以异步的方式执行 DispatchQueue.global().async{[weakself]in self?.countDownThread(); } } funccountDownThread(){ lettimeCount=limitTime; for_in0..计时方式三(Timer)
//MARK:定时方式三 varlimitTime:Int=5; vartimer:Timer?; funcstartCountDown(){ //初始化定时器 timer=Timer.scheduledTimer(timeInterval:1.0,target:self,selector:#selector(updateJumpBtn),userInfo:nil,repeats:true); /* //避免timer在列表时,滑动时timer会暂停。将timer放在另外一个线程中,然后开启这个线程的runloop。 DispatchQueue.global().async{[weakself]in self?.timer=Timer.scheduledTimer(timeInterval:1.0,target:selfasAny,selector:#selector(self?.countDownThread),userInfo:nil,repeats:true); RunLoop.current.run(); } */ } @objcfunccountDownThread(){ //主线程刷新UI DispatchQueue.main.async{[weakself]in self?.updateJumpBtn(); } } @objcfuncupdateJumpBtn(){ limitTime=limitTime-1; if(limitTime<=0){ jumpBut.setTitle("跳过",for:.normal); /* //暂停定时器 timer?.fireDate=Date.distantFuture; //继续定时 timer?.fireDate=NSDate.init()asDate; //暂停定时器3秒 timer?.fireDate=Date.init(timeIntervalSinceNow:3.0); */ //停止定时器 timer?.invalidate(); }else{ jumpBut.setTitle("跳过"+"(\(limitTime)S)",for:.normal); } }计时方式四(GCD)
//MARK:定时方式四 varlimitTime:Int=5+1; //在global线程里创建一个时间源 letcodeTimer=DispatchSource.makeTimerSource(queue:DispatchQueue.global()); funcstartCountDown(){ //设定这个时间源是每秒循环一次,立即开始 codeTimer.schedule(deadline:.now(),repeating:.seconds(1)); //设定时间源的触发事件 codeTimer.setEventHandler(handler:{ //主线程刷新UI DispatchQueue.main.async{[weakself]in self?.updateJumpBtn(); } }) //判断是否取消,如果已经取消了避免调用resume()方法导致的崩溃 ifcodeTimer.isCancelled{ return; } //启动时间源 codeTimer.resume(); } funcupdateJumpBtn(){ limitTime=limitTime-1; if(limitTime<=0){ jumpBut.setTitle("跳过",for:.normal); //暂停计时。暂停之后,再次开始计时(startCountDown())接着上次暂停进行计时 codeTimer.suspend(); //取消计时。取消之后,再次开始计时(startCountDown())不会再计时 //codeTimer.cancel(); }else{ jumpBut.setTitle("跳过"+"(\(limitTime)S)",for:.normal); } }示意图
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。