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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。