55 - Swift 之 Timer (NSTimer )定時器

一 、 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!)
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容