Swift4使用GCD实现计时器
开发过程中,我们可能会经常使用到计时器。苹果为我们提供了Timer。但是在平时使用过程中会发现使用Timer会有许多的不便
1:必须保证在一个活跃的runloop,我们知道主线程的runloop是活跃的,但是在其他异步线程runloop就需要我们自己去开启,非常麻烦。
2:Timer的创建和销毁必须在同一个线程。跨线程就操作不了
3:内存问题。可能循环引用造成内存泄露
由于存在上述问题,我们可以采用GCD封装来解决。
importUIKit typealiasActionBlock=()->() classMRGCDTimer:NSObject{ staticletshare=MRGCDTimer() lazyvartimerContainer=[String:DispatchSourceTimer]() ///创建一个名字为name的定时 /// ///-Parameters: ///-name:定时器的名字 ///-timeInterval:时间间隔 ///-queue:线程 ///-repeats:是否重复 ///-action:执行的操作 funcscheduledDispatchTimer(withNamename:String?,timeInterval:Double,queue:DispatchQueue,repeats:Bool,action:@escapingActionBlock){ ifname==nil{ return } vartimer=timerContainer[name!] iftimer==nil{ timer=DispatchSource.makeTimerSource(flags:[],queue:queue) timer?.resume() timerContainer[name!]=timer } timer?.schedule(deadline:.now(),repeating:timeInterval,leeway:.milliseconds(100)) timer?.setEventHandler(handler:{[weakself]in action() ifrepeats==false{ self?.destoryTimer(withName:name!) } }) } ///销毁名字为name的计时器 /// ///-Parametername:计时器的名字 funcdestoryTimer(withNamename:String?){ lettimer=timerContainer[name!] iftimer==nil{ return } timerContainer.removeValue(forKey:name!) timer?.cancel() } ///检测是否已经存在名字为name的计时器 /// ///-Parametername:计时器的名字 ///-Returns:返回bool值 funcisExistTimer(withNamename:String?)->Bool{ iftimerContainer[name!]!=nil{ returntrue } returnfalse } }
使用方法
MRGCDTimer.share.scheduledDispatchTimer(withName:"name",timeInterval:1,queue:.main,repeats:true){ //code self.updateCounter() }
取消计时器
MRGCDTimer.share.destoryTimer(withName:"name")
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。