iOS中的3種定時器匯總介紹
在iOS中有3種常見的定時器,它們會根據(jù)不同的場景進行選擇使用。
1.DispatchSourceTimer: 基于GCD實現(xiàn)。
2.CADisplayLink:基于屏幕刷新實現(xiàn)。
3.Timer:基于RunLoop實現(xiàn)。
DispatchSourceTimer定時器
DispatchSourceTimer定時器可以通過DispatchSource.makeTimerSource(queue: DispatchQueue.main)方法來創(chuàng)建,并且
使用GCD創(chuàng)建了一個DispatchSource類型的定時器,并使用全局隊列來運行它。通過schedule(deadline: .now(), repeating: .seconds(1))方法指定定時器的初始延遲和重復時間,然后設置了一個事件處理程序來定義定時器要執(zhí)行的操作。
最后timer.resume()啟動定時器。
要停止定時器,可以調用timer.cancel()方法。
優(yōu)點為:Dispatch定時器非常輕量級,基于GCD的實現(xiàn),可以利用GCD的優(yōu)勢來進行任務調度,性能高。
var timer: DispatchSourceTimer? func startCountdown() { //一般倒計時是操作UI,使用主隊列 timer = DispatchSource.makeTimerSource(queue: DispatchQueue.main) // //耗時操作放在全局隊列,子線程處理 // timer = DispatchSource.makeTimerSource(queue: DispatchQueue.global()) timer.schedule(deadline: .now(), repeating: .seconds(1)) timer.setEventHandler { // 定時器執(zhí)行的操作 } timer.resume() } deinit { timer.cancel() timer = nil }
CADisplayLink定時器
CADisplayLink定時器可以通過CADisplayLink(target: self, selector: #selector(update))方法創(chuàng)建,并且通過displayLink.add(to: .main, forMode: .common)方法將定時器添加到主運行循環(huán)中,并指定了運行模式。
然后定義update方法,該方法將在每個定時器周期中執(zhí)行。
在對象銷毀前停止定時器,可以調用displayLink.invalidate()方法。
CADisplayLink對象一旦創(chuàng)建就會運行,比較適合監(jiān)控主線程UI卡頓,用做倒計時不如使用DispatchSourceTimer
它是和屏幕刷新率同步,優(yōu)點在于精確度高,適用于需要頻繁更新UI的場景。
var displayLink: CADisplayLink? func startCountdown() { //一般倒計時是操作UI,使用主隊列 let displayLink = CADisplayLink(target: self, selector: #selector(update)) //設置多長時間回調一次,默認每次刷新都會調用,大概60ps, 這里設置1表示1s調用一次 displayLink.preferredFramesPerSecond = 1 displayLink.add(to: .main, forMode: .common) } @objc func update() { // 定時器執(zhí)行的操作 } deinit { displayLink.invalidate() displayLink = nil }
Timer定時器
Timer定時器可以使用Timer.scheduledTimer方法創(chuàng)建,然后指定重復間隔和一個閉包作為定時器要執(zhí)行的操作。并且將返回的定時器對象存儲在變量timer中。
要停止定時器,可以調用timer.invalidate()方法。
Timer是一個簡單的定時器,基于RunLoop的,通常用于實現(xiàn)對實時性要求不高的場合,因為它被注冊在runloop的timers事件源集合中,如果當前runloop執(zhí)行耗時任務超過了調用時間,那么就會丟棄當前次,直接執(zhí)行下一次。導致定時器不準時的情況。
var timer: Timer? func startCountdown() { //一般倒計時是操作UI,使用主隊列 timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in // 定時器執(zhí)行的操作 } } deinit { timer.invalidate() timer = nil }
到此這篇關于iOS中的3種定時器匯總介紹的文章就介紹到這了,更多相關iOS中的3種定時器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
iOS中利用CAEmitterLayer實現(xiàn)粒子動畫詳解
粒子效果應該對現(xiàn)在很多人來說并不陌生,我們之前也分享了一些相關文章,下面這篇文章主要給大家介紹了關于iOS中利用CAEmitterLayer實現(xiàn)粒子動畫的相關資料,文中介紹的非常詳細,需要的朋友們下面來一起看看吧。2017-06-06iOS App開發(fā)中Core Data框架基本的數(shù)據(jù)管理功能小結
除了使用SQL關系型數(shù)據(jù)庫,我們還可以使用Xcode中提供的Core Data來進行表結構數(shù)據(jù)處理,這里我們就來初步整理iOS App開發(fā)中Core Data框架基本的數(shù)據(jù)管理功能小結:2016-06-06詳解iOS通過ASIHTTPRequest提交JSON數(shù)據(jù)
這篇文章主要介紹了詳解iOS通過ASIHTTPRequest提交JSON數(shù)據(jù),對代碼進行了詳細的講解,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2016-12-12