swift3.0 實(shí)現(xiàn)gcd定時(shí)器

//? 優(yōu)點(diǎn): 1.不用考慮RunLoop,切換RunLoop的時(shí)候 定時(shí)器照樣跑

//? ? ? ? 2.不用考慮強(qiáng)引用導(dǎo)致 控制器不銷毀的問(wèn)題,定時(shí)器的生命周期和和其所在生命范圍一致,在方法里面那就方法執(zhí)行完畢即停止,在控制器里面則在控制器銷毀時(shí)候停止。

//? ? ? ? 3.多次創(chuàng)建沒(méi)問(wèn)題,一個(gè)指針只會(huì)指向一個(gè)實(shí)例。當(dāng)這個(gè)實(shí)例不被指向的時(shí)候就銷毀不再執(zhí)行


import UIKit

class DZTimer {

/// GCD 定時(shí)器

var codeTimer : DispatchSourceTimer!

/// 定時(shí)器初始化 定時(shí)器立即開(kāi)始一次

///

/// - Parameters:

///? - seconds: 多長(zhǎng)時(shí)間執(zhí)行一次

///? - timeout: 設(shè)置不設(shè)置超時(shí)時(shí)間 默認(rèn)永遠(yuǎn)不超時(shí)

///? - timerAction: 回掉

init(seconds:Double,timeout:Double = Double(CGFloat.greatestFiniteMagnitude),timerAction:@escaping ()->()) {

// 在global線程里創(chuàng)建一個(gè)時(shí)間源

var timeout = timeout

codeTimer = DispatchSource.makeTimerSource(queue:DispatchQueue.global())

// 設(shè)定這個(gè)時(shí)間源是seconds設(shè)定的秒循環(huán)一次,立即開(kāi)始 設(shè)置1000 的原因是毫秒計(jì)時(shí)

codeTimer.scheduleRepeating(deadline: .now(), interval: .milliseconds(Int(seconds * 1000)))

// 設(shè)定時(shí)間源的觸發(fā)事件

codeTimer.setEventHandler(handler: { [weak self] _ in

// 每半秒計(jì)時(shí)一次

timeout = timeout - 1

// 時(shí)間到了取消時(shí)間源

if timeout <= 0{

self?.codeTimer.cancel()

}

// 返回主線程處理一些事件,更新UI等等

DispatchQueue.main.async {

timerAction()

}

})

//啟動(dòng)定時(shí)器

if #available(iOS 10.0, *) {

codeTimer.activate()

} else {

codeTimer.resume()

// Fallback on earlier versions

}

}

/// 終止定時(shí)器

func cancel() {

codeTimer.cancel()

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ======================= 前言 RunLoop 是 iOS 和 OSX 開(kāi)發(fā)中非常基礎(chǔ)的一個(gè)...
    i憬銘閱讀 985評(píng)論 0 4
  • 什么是Run Loops RunLoops是與線程相關(guān)聯(lián)的基礎(chǔ)部分,一個(gè)Run Loop就是事件處理循環(huán),他是用來(lái)...
    傻傻小蘿卜閱讀 1,096評(píng)論 0 5
  • 轉(zhuǎn)載:http://www.cocoachina.com/ios/20150601/11970.html RunL...
    Gatling閱讀 1,548評(píng)論 0 13
  • http://www.cocoachina.com/ios/20150601/11970.html RunLoop...
    紫色冰雨閱讀 947評(píng)論 0 3
  • 我是上個(gè)時(shí)代的遺老老的像那只烏龜堅(jiān)硬的外殼一圈圈的回紋沒(méi)有神經(jīng)感覺(jué)不到疼痛只記得天冷了睡個(gè)大覺(jué)直到驚蟄天上打了雷睜...
    bodhi1984閱讀 225評(píng)論 0 0

友情鏈接更多精彩內(nèi)容