最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS中的3種定時器匯總介紹

 更新時間:2023年05月11日 08:14:54   作者:滴水微瀾  
這篇文章主要介紹了iOS中的3種定時器匯總介紹的相關(guān)資料,需要的朋友可以參考下

在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))方法指定定時器的初始延遲和重復(fù)時間,然后設(shè)置了一個事件處理程序來定義定時器要執(zhí)行的操作。

最后timer.resume()啟動定時器。

要停止定時器,可以調(diào)用timer.cancel()方法。

優(yōu)點為:Dispatch定時器非常輕量級,基于GCD的實現(xiàn),可以利用GCD的優(yōu)勢來進行任務(wù)調(diào)度,性能高。

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í)行。

在對象銷毀前停止定時器,可以調(diào)用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))
    //設(shè)置多長時間回調(diào)一次,默認每次刷新都會調(diào)用,大概60ps, 這里設(shè)置1表示1s調(diào)用一次
    displayLink.preferredFramesPerSecond = 1
    displayLink.add(to: .main, forMode: .common)
}
@objc func update() {
    // 定時器執(zhí)行的操作
}
deinit {
    displayLink.invalidate()
    displayLink = nil
}

Timer定時器

Timer定時器可以使用Timer.scheduledTimer方法創(chuàng)建,然后指定重復(fù)間隔和一個閉包作為定時器要執(zhí)行的操作。并且將返回的定時器對象存儲在變量timer中。

要停止定時器,可以調(diào)用timer.invalidate()方法。

Timer是一個簡單的定時器,基于RunLoop的,通常用于實現(xiàn)對實時性要求不高的場合,因為它被注冊在runloop的timers事件源集合中,如果當前runloop執(zhí)行耗時任務(wù)超過了調(diào)用時間,那么就會丟棄當前次,直接執(zhí)行下一次。導(dǎo)致定時器不準時的情況。

var timer: Timer?
func startCountdown() {
    //一般倒計時是操作UI,使用主隊列
    timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
    // 定時器執(zhí)行的操作
    }
}
deinit {
    timer.invalidate()
    timer = nil
}

到此這篇關(guān)于iOS中的3種定時器匯總介紹的文章就介紹到這了,更多相關(guān)iOS中的3種定時器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

五莲县| 高陵县| 武鸣县| 永胜县| 海门市| 庐江县| 旺苍县| 景宁| 新宁县| 高州市| 华容县| 宁津县| 尚义县| 怀来县| 南涧| 锡林郭勒盟| 乳源| 遵义市| 中牟县| 明水县| 曲沃县| 龙海市| 张家川| 辰溪县| 汪清县| 武邑县| 扶绥县| 金阳县| 红桥区| 类乌齐县| 方城县| 西藏| 定陶县| 马尔康县| 大方县| 忻州市| 陆良县| 新河县| 兖州市| 富平县| 固阳县|