倒計時是個很常用的東西拯辙,創(chuàng)建倒計時要把計時器放入到runloop 當(dāng)中眠饮,因為計時器也是一種資源禽绪,資源只有放入到runloop當(dāng)中才能起作用猾骡。創(chuàng)建計時器的方法有好幾種:
1,NSTimer 在swift當(dāng)中沒有NS直接Timer進(jìn)行創(chuàng)建
2蚜印,CADisplayLink以屏幕刷新幀率結(jié)束進(jìn)行觸發(fā)計時操作莺禁,精準(zhǔn)度比較高
3,DispatchSourceTimer 利用GCD進(jìn)行創(chuàng)建計時器窄赋,系統(tǒng)默認(rèn)進(jìn)行重復(fù)操作
因為計時器是這玩意很容易出現(xiàn)線程的問題哟冬,而且處理不當(dāng)會直接影響性能和用戶的體驗方面楼熄,所以推薦使用GCD來創(chuàng)建計時器,這里是以swift為例簡單介紹一下浩峡。
創(chuàng)建計時器
var time = DispatchSource.makeTimerSource()
//倒計時的總時間 初始值自己填寫
var times = TimeInterval()
//repeating代表間隔1秒
time.schedule(deadline: .now(), repeating: 1)
time.setEventHandler(handler: {
if self.times<0{
self.time.cancel()
}else {
DispatchQueue.main.async {
self.button.setTitle(self.returnTimeTofammater(times: self.times), for: .normal)
self.times-=1
}
}
})
//點擊開始倒計時
@objc func starAction(sender:UIButton){
if sender.isSelected == true {
time.suspend()
sender.setTitle("暫停", for: .normal)
}else{
time.resume()
}
sender.isSelected = !sender.isSelected
}
介紹兩個方法可岂,一個是將TimeInterval類型的值轉(zhuǎn)為字符串
//將多少秒傳進(jìn)去得到00:00:00這種格式
func returnTimeTofammater(times:TimeInterval) -> String {
if times==0{
return "00:00:00"
}
var Min = Int(times / 60)
let second = Int(times.truncatingRemainder(dividingBy: 60));
var Hour = 0
if Min>=60 {
Hour = Int(Min / 60)
Min = Min - Hour*60
return String(format: "%02d : %02d : %02d", Hour, Min, second)
}
return String(format: "00 : %02d : %02d", Min, second)
}
一個是將字符串類型的值轉(zhuǎn)為int數(shù)字
//根據(jù)顯示的字符串00:00:00轉(zhuǎn)化成秒數(shù)
func getSecondsFromTimeStr(timeStr:String) -> Int {
if timeStr.isEmpty {
return 0
}
let timeArry = timeStr.replacingOccurrences(of: ":", with: ":").components(separatedBy: ":")
var seconds:Int = 0
if timeArry.count > 0 && isPurnInt(string: timeArry[0]){
let hh = Int(timeArry[0])
if hh! > 0 {
seconds += hh!*60*60
}
}
if timeArry.count > 1 && isPurnInt(string: timeArry[1]){
let mm = Int(timeArry[1])
if mm! > 0 {
seconds += mm!*60
}
}
if timeArry.count > 2 && isPurnInt(string: timeArry[2]){
let ss = Int(timeArry[2])
if ss! > 0 {
seconds += ss!
}
}
return seconds
}
//掃描字符串的值
func isPurnInt(string: String) -> Bool {
let scan:Scanner = Scanner.init(string: string)
var val:Int = 0
return scan.scanInt(&val) && scan.isAtEnd
}
說到這里基本的就完了,自己可以動手試一下