一 、 Timer的介紹
? ? ? ? ? ? ? ? 在軟件開發(fā)過程中,我們常常需要在某個時間后執(zhí)行某個方法,或者是按照某個周期一直執(zhí)行某個方法。在這個時候,我們就需要用到定時器。Timer 繼承與 NSObject 是一個時間管理類。
二 、Timer 的幾種創(chuàng)建方式
1> 第一種Timer
// TODO : 第一種Timer的創(chuàng)建
func firstTimer() -> Void {
let timer = Timer.init(timeInterval: 2, repeats:true) { (kTimer) in
print("定時器啟動了")
}
RunLoop.current.add(timer, forMode: .defaultRunLoopMode)
// TODO : 啟動定時器
timer.fire()
}
解釋:這種定時器的創(chuàng)建需要使用 fire 來啟動定時器。否則,該定時器不起作用。如果定時器不添加到 RunLoop 中,在重復(fù)模式下定時器只執(zhí)行一次。
---> 第一種Timer的另一種創(chuàng)建方式
// TODO: 另一種創(chuàng)建方式
func firstTimerOther() -> Void {
let timer = Timer.init(timeInterval: 2, target: self, selector: #selector(foTimer(_:)), userInfo: nil, repeats: true)
RunLoop.current.add(timer, forMode: .defaultRunLoopMode)
timer.fire()
}
/**
方法
*/
func foTimer(_ timer:Timer) -> Void {
print("第一種定時器的另一個定時器的觸發(fā)方法")
}
2> 第二種 Timer
// TODO: 第二種定時器
func secondTimer() -> Void {
/**
設(shè)定開始的時間
*/
let timeDate = Date.init(timeIntervalSinceNow: 79)
let timer = Timer.init(fire: timeDate, interval: 2, repeats: true) { (Timer) in
print("設(shè)置開始時間定時器")
}
RunLoop.current.add(timer, forMode: .defaultRunLoopMode)
timer.fire()
}
---> 第二種的另一種創(chuàng)建方式
// TODO: 第二種 Timer 的另一種創(chuàng)建方式
func secondTimerOther() -> Void {
/**
設(shè)定開始的時間
*/
let timeDate = Date.init(timeIntervalSinceNow: 79)
let timer = Timer.init(fireAt: timeDate, interval: 2, target: self, selector: #selector(secondOtherTimer(_ :)), userInfo: nil, repeats: true)
RunLoop.current.add(timer, forMode: .defaultRunLoopMode)
timer.fire()
}
/**
觸發(fā)事件的實(shí)現(xiàn)
*/
func secondOtherTimer(_ timer:Timer) -> Void {
print("第二中定時器的另一種創(chuàng)建方式的觸發(fā)事件")
}
3> 第三種Timer的創(chuàng)建
// MARK : 下面這兩種定時器創(chuàng)建方式是直接添加到RunLoop中,無需 fire.
// TODO : 定時器的觸發(fā)方法在創(chuàng)建定時器內(nèi)部
func threeTimer() -> Void {
Timer.scheduledTimer(withTimeInterval: 2, repeats: true) { (ktimer) in
print("第三個定時器觸發(fā)")
}
}
---> 另一種創(chuàng)建方式
// TODO : 定時器的觸發(fā)的方法在定時器的外部
func fourTimer() -> Void {
/**
參數(shù)解釋
target : 定時器應(yīng)用的對象
userInfo : 定時器攜帶一些信息
selector : 定時器觸發(fā)的函數(shù)
repeats : 控制定時器是否重復(fù)觸發(fā)
*/
Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(timeRepeat(_:)), userInfo: nil, repeats: true)
}
func timeRepeat(_ time:Timer) -> Void {
print("第四個定時器觸發(fā)")
}
4> 定時器的還有兩個方法
public /*not inherited*/ init(timeInterval ti: TimeInterval, invocation: NSInvocation, repeats yesOrNo: Bool)
open class func scheduledTimer(timeInterval ti: TimeInterval, invocation: NSInvocation, repeats yesOrNo: Bool) -> Timer
注釋: 定時器的這兩個方法,不能直接使用,因?yàn)樵?Swift中沒有 ** NSInvocation** 對象。如果硬是要使用這兩個方法創(chuàng)建定時器,那就要使用 OC 的方法做橋接處理。
三、定時器的一些參數(shù)的介紹
// TODO : 定時器參數(shù)的介紹
func introduceTimerParam() -> Void {
/**
定時器的啟動方法
注意:如果定時器是以 scheduledTimer 開頭創(chuàng)建的,就不需要 fire。
*/
KTimer?.fire()
/**
將定時器加入 RunLoop 中
注意 : 除了 scheduledTimer 開頭創(chuàng)建的定時器,不用添加 RunLoop。其他的創(chuàng)建都需要添加,否者,定時器在重復(fù)觸發(fā)狀態(tài)下就只觸發(fā)一次
*/
RunLoop.current.add(KTimer!, forMode: .defaultRunLoopMode)
/**
開始日期的獲取
*/
let startDate = KTimer?.fireDate
print(startDate!)
/**
獲取定時器設(shè)定的時間
*/
let time = KTimer?.timeInterval
print(time!)
/**
判斷定時器是否可用
*/
let isValid = KTimer?.isValid
print(isValid!)
/**
停止定時器,銷毀
*/
KTimer?.invalidate()
/**
獲取定時器攜帶的信息
*/
let timerInfo = KTimer?.userInfo
print(timerInfo!)
}