95 lines
2.5 KiB
Swift
95 lines
2.5 KiB
Swift
//
|
|
// GCDTimer.swift
|
|
// TUICallKit
|
|
//
|
|
// Created by vincepzhang on 2023/2/13.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
typealias GCDTimerTaskEvent = () -> Void
|
|
|
|
class GCDTimer {
|
|
|
|
static var timerDic: [String: DispatchSourceTimer] = Dictionary()
|
|
|
|
static func start(interval:Int, repeats: Bool, async: Bool, task:@escaping GCDTimerTaskEvent) -> String {
|
|
|
|
let codeTimer = DispatchSource.makeTimerSource(queue: async ? DispatchQueue.global() : DispatchQueue.main)
|
|
|
|
let timerName = String(Date().timeIntervalSinceReferenceDate)
|
|
timerDic[timerName] = codeTimer
|
|
|
|
codeTimer.schedule(deadline: .now(), repeating: .seconds(interval))
|
|
codeTimer.setEventHandler(handler: {
|
|
DispatchQueue.main.async {
|
|
task()
|
|
}
|
|
if !repeats {
|
|
self.cancel(timerName: timerName) {
|
|
}
|
|
}
|
|
})
|
|
|
|
if codeTimer.isCancelled { return timerName}
|
|
codeTimer.resume()
|
|
return timerName
|
|
}
|
|
|
|
static func cancel(timerName: String, task: @escaping GCDTimerTaskEvent) {
|
|
if let timer = timerDic[timerName] {
|
|
timer.cancel()
|
|
timerDic.removeValue(forKey: timerName)
|
|
}
|
|
task()
|
|
}
|
|
|
|
static func secondToHMS(second: Int) -> (hour: Int, min: Int, sec: Int) {
|
|
var sec: Int = 0
|
|
var min: Int = 0
|
|
var hour: Int = 0
|
|
|
|
let oneHour = 3_600
|
|
let oneMin = 60
|
|
|
|
hour = second / oneHour
|
|
min = (second % oneHour) / oneMin
|
|
sec = (second % oneHour) % oneMin
|
|
|
|
return (hour, min, sec)
|
|
}
|
|
|
|
static func secondToHMSString(second: Int) -> String {
|
|
let time = GCDTimer.secondToHMS(second: second)
|
|
var hour: String
|
|
var min: String
|
|
var seconds: String
|
|
|
|
if time.hour <= 0 {
|
|
hour = ""
|
|
} else if time.hour >= 0 && time.hour < 10 {
|
|
hour = "0\(time.hour):"
|
|
} else {
|
|
hour = String(time.hour) + ":"
|
|
}
|
|
|
|
if time.min <= 0 {
|
|
min = "00:"
|
|
} else if time.min >= 0 && time.min < 10 {
|
|
min = "0\(time.min):"
|
|
} else {
|
|
min = String(time.min) + ":"
|
|
}
|
|
|
|
if time.sec <= 0 {
|
|
seconds = "00"
|
|
} else if time.sec >= 0 && time.sec < 10 {
|
|
seconds = "0\(time.sec)"
|
|
} else {
|
|
seconds = String(time.sec)
|
|
}
|
|
|
|
return "\(hour)\(min)\(seconds)"
|
|
}
|
|
}
|