Timer 計時器 (SwiftUI中文文檔手冊)

Timer

經(jīng)過一定時間間隔后將觸發(fā)的計時器,將指定的消息發(fā)送到目標對象。

class Timer : NSObject

總覽

計時器與運行循環(huán)配合使用。運行循環(huán)會維護對其計時器的強引用,因此在將計時器添加到運行循環(huán)后,您不必維護自己的對計時器的強引用。

為了有效地使用計時器,您應(yīng)該了解運行循環(huán)的運行方式.計時器不是實時機制。如果在長時間運行的循環(huán)調(diào)用期間或運行循環(huán)處于不監(jiān)視計時器的模式時發(fā)生計時器的觸發(fā)時間,則直到下一次運行循環(huán)檢查計時器時,計時器才會啟動。因此,計時器觸發(fā)的實際時間可能要晚得多。另請參閱計時器容差。

比較重復(fù)和不重復(fù)計時器

您可以指定計時器在創(chuàng)建時是重復(fù)還是不重復(fù)。非重復(fù)計時器觸發(fā)一次,然后自動使其自身無效,從而防止計時器再次觸發(fā)。相比之下,重復(fù)計時器會觸發(fā),然后在同一運行循環(huán)上重新安排自身的時間。重復(fù)計時器始終根據(jù)計劃的點火時間進行調(diào)度,而不是實際的點火時間。例如,如果定時器計劃在特定時間觸發(fā),然后每5秒觸發(fā)一次,則即使實際觸發(fā)時間被延遲,計劃的觸發(fā)時間也將始終落在原始的5秒時間間隔上。如果觸發(fā)時間延遲得太遠,以至于超過了計劃的觸發(fā)時間中的一個或多個,則計時器在該時間段僅觸發(fā)一次;觸發(fā)后,計時器會重新安排,

計時器公差

在iOS 7和更高版本以及macOS 10.9和更高版本中,您可以指定計時器的公差(tolerance)。計時器啟動時的這種靈活性提高了系統(tǒng)優(yōu)化的能力,以提高節(jié)電和響應(yīng)速度。計時器可以在其預(yù)定的點火日期與預(yù)定的點火日期加公差之間的任何時間點火。計時器不會在計劃的觸發(fā)日期之前觸發(fā)。對于重復(fù)計時器,下一個點火日期是根據(jù)原始點火日期計算的,而不考慮各個點火時間的公差,以避免漂移。默認值為零,這意味著不應(yīng)用其他公差。系統(tǒng)保留對某些計時器應(yīng)用少量容差的權(quán)利,而不論該tolerance屬性的值如何。

作為計時器的用戶,您可以確定計時器的適當公差。一般規(guī)則,對于重復(fù)計時器,將公差設(shè)置為間隔的至少10%。即使很小的容差也會對應(yīng)用程序的電源使用產(chǎn)生重大的積極影響。系統(tǒng)可以強制執(zhí)行公差的最大值。

在運行循環(huán)中安排計時器

您可以一次僅在一個運行循環(huán)中注冊一個計時器,盡管可以將其添加到該運行循環(huán)中的多個運行循環(huán)模式中。有三種創(chuàng)建計時器的方法:

  • 使用或類方法創(chuàng)建計時器,并在默認模式下將其安排在當前運行循環(huán)上。scheduledTimer(timeInterval:invocation:repeats:)scheduledTimer(timeInterval:target:selector:userInfo:repeats:)

  • 使用或類方法創(chuàng)建計時器對象,而不在運行循環(huán)上安排它。(創(chuàng)建計時器后,必須通過調(diào)用相應(yīng)對象的方法將計時器手動添加到運行循環(huán)中。)init(timeInterval:invocation:repeats:)init(timeInterval:target:selector:userInfo:repeats:)add(_:forMode:)RunLoop

  • 分配計時器并使用方法將其初始化。(創(chuàng)建計時器后,必須通過調(diào)用相應(yīng)對象的方法將計時器手動添加到運行循環(huán)中。)init(fireAt:interval:target:selector:userInfo:repeats:)add(_:forMode:)RunLoop

一旦安排在運行循環(huán)中,計時器就會以指定的時間間隔觸發(fā),直到失效為止。非重復(fù)計時器在觸發(fā)后立即失效。但是,對于重復(fù)計時器,您必須通過調(diào)用其invalidate()方法自己使計時器對象無效。調(diào)用此方法要求從當前運行循環(huán)中刪除計時器。因此,您應(yīng)該始終invalidate()從安裝計時器的同一線程中調(diào)用該方法。使計時器無效會使它立即禁用,以使其不再影響運行循環(huán)。然后,運行循環(huán)將刪除該計時器(以及該計時器必須具有的強引用),方法是在invalidate()方法返回之前或稍后。一旦失效,計時器對象將無法重用。

重復(fù)觸發(fā)計時器后,它將在指定的內(nèi),為最近的將來日期安排下一次觸發(fā),該日期是最近一次計劃的點火日期之后計時器間隔的整數(shù)倍tolerance。如果調(diào)出執(zhí)行選擇器或調(diào)用所需的時間長于指定的間隔,則計時器僅安排下一次觸發(fā);否則,定時器將僅計劃下一次觸發(fā)。也就是說,計時器不會嘗試補償在調(diào)用指定的選擇器或調(diào)用時可能發(fā)生的任何丟失的觸發(fā)。

子類注釋

不要子類化Timer。


主題

創(chuàng)建一個計時器

1、class func scheduledTimer(withTimeInterval: TimeInterval, repeats: Bool, block: (Timer) -> Void) -> Timer

創(chuàng)建一個計時器,并在默認模式下將其安排在當前運行循環(huán)上。

2、class func scheduledTimer(timeInterval: TimeInterval, target: Any, selector: Selector, userInfo: Any?, repeats: Bool) -> Timer

創(chuàng)建一個計時器,并在默認模式下將其安排在當前運行循環(huán)上。

3、class func scheduledTimer(timeInterval: TimeInterval, invocation: NSInvocation, repeats: Bool) -> Timer

創(chuàng)建一個新計時器,并在默認模式下將其安排在當前運行循環(huán)上。

4、init(timeInterval: TimeInterval, repeats: Bool, block: (Timer) -> Void)

使用指定的時間間隔和塊初始化計時器對象。

5、init(timeInterval: TimeInterval, target: Any, selector: Selector, userInfo: Any?, repeats: Bool)

使用指定的對象和選擇器初始化計時器對象。

6、init(timeInterval: TimeInterval, invocation: NSInvocation, repeats: Bool)

使用指定的調(diào)用對象初始化計時器對象。

7、init(fire: Date, interval: TimeInterval, repeats: Bool, block: (Timer) -> Void)

使用指定的塊為指定的日期和時間間隔初始化計時器。

8、init(fireAt: Date, interval: TimeInterval, target: Any, selector: Selector, userInfo: Any?, repeats: Bool)

使用指定的對象和選擇器初始化計時器。


觸發(fā)計時器

func fire()

使計時器的消息發(fā)送到其目標。


停止計時器

func invalidate()

停止計時器再次觸發(fā),并請求將其從運行循環(huán)中刪除。


檢索計時器信息

1、var isValid: Bool

一個布爾值,指示計時器當前是否有效。

2、var fireDate: Date

計時器將觸發(fā)的日期。

3、var timeInterval: TimeInterval

計時器的時間間隔,以秒為單位。

4、var userInfo: Any?

接收者的對象。userInfo


配置射擊公差

1、var tolerance: TimeInterval

在計劃的觸發(fā)日期之后定時器可以觸發(fā)的時間。


作為組合發(fā)布者觸發(fā)消息

1、static func publish(every: TimeInterval, tolerance: TimeInterval?, on: RunLoop, in: RunLoop.Mode, options: RunLoop.SchedulerOptions?) -> Timer.TimerPublisher

返回一個發(fā)布者,該發(fā)布者在給定的時間間隔內(nèi)反復(fù)發(fā)出當前日期。

2、class Timer.TimerPublisher

在給定的時間間隔內(nèi)反復(fù)發(fā)出當前日期的發(fā)布者。

實戰(zhàn)代碼

SwiftUI Timer仿短信發(fā)送倒計時(教程含源碼)

推薦

基礎(chǔ)文章推薦

經(jīng)典教程推薦

上新

技術(shù)源碼推薦

推薦文章

CoreData篇

Combine篇

TextField篇

JSON文件篇


一篇文章系列

技術(shù)交流

QQ:3365059189
SwiftUI技術(shù)交流QQ群:518696470

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

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