enum RepeatingTimerState {
case suspended
case resumed
}
protocol PrompterTimeHelperProtocol: NSObjectProtocol {
func eventHandler(_ timer: RepeatingTimer)
func statusChange(_ status: RepeatingTimerState)
}
/// 提词器定时器逻辑 helper
class RepeatingTimer {
// MARK: - 外部属性
weak var delegate: PrompterTimeHelperProtocol?
// MARK: - 内部属性
private let timeInterval: DispatchTimeInterval
private var state: RepeatingTimerState = .suspended {
didSet {
delegate?.statusChange(state)
}
}
private lazy var timer: DispatchSourceTimer = {
let t = DispatchSource.makeTimerSource(flags: .strict, queue: DispatchQueue.global())
t.schedule(deadline: .now() + self.timeInterval, repeating: self.timeInterval)
t.setEventHandler(handler: { [weak self] in
guard let self = self else { return }
self.eventHandler()
})
return t
}()
required init(timeInterval: DispatchTimeInterval) {
self.timeInterval = timeInterval
}
deinit {
cancel()
}
}
// MARK: - About Public Custom Action
extension RepeatingTimer {
func resume() {
if state == .resumed {
return
}
state = .resumed
timer.resume()
}
func suspend() {
if state == .suspended {
return
}
state = .suspended
timer.suspend()
}
func cancel() {
timer.setEventHandler {}
timer.cancel()
/*
If the timer is suspended, calling cancel without resuming
triggers a crash. This is documented here https://forums.developer.apple.com/thread/15902
*/
resume()
delegate = nil
}
}
// MARK: - About Private Custom Action
private extension RepeatingTimer {
func eventHandler() {
DispatchQueue.main.async {
self.delegate?.eventHandler(self)
}
}
}
DispatchSourceTimer 简易封装 - Swift版
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- JSON对象转Model其实是一个编解码的过程,Swift原生提供Codable协议负责编解码的工作,遵循协议的对...
- 不多说,轮播图是开发中必要一项技能,直接上代码: 先说我的思路:首次继承于UIScrollView类自定义MySc...
- UserDefaults 这个东西相信大家都用过,但是它的存取需要写很长的方法调用,感觉很笨拙。我们为何不用 su...
- 关于网络请求,swift版本的最多的就是alamofire,是afn的swift版本,git上有详细用法,这里就不...