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篇
- SwiftUI數(shù)據(jù)存儲之做個筆記App 新增與查詢(CoreData)
- SwiftUI進階之存儲用戶狀態(tài)實現(xiàn)登錄與登出
- SwiftUI 數(shù)據(jù)之List顯示Sqlite數(shù)據(jù)庫內(nèi)容(2020年教程)
Combine篇
TextField篇
- 《SwiftUI 一篇文章全面掌握TextField文本框 (教程和全部源碼)》
- 《SwiftUI實戰(zhàn)之TextField風格自定義與formatters》
- 《SwiftUI實戰(zhàn)之TextField如何給鍵盤增加個返回按鈕(隱藏鍵盤)》
- 《SwiftUI 當鍵盤出現(xiàn)時避免TextField被遮擋自動向上移動》
- 《SwiftUI實戰(zhàn)之TextField如何給鍵盤增加個返回按鈕(隱藏鍵盤)》
JSON文件篇
一篇文章系列
- SwiftUI一篇文章全面掌握List(教程和源碼)
- 《SwiftUI 一篇文章全面掌握TextField文本框 (教程和全部源碼)》
- SwiftUI一篇文章全面掌握Picker,解決數(shù)據(jù)選擇(教程和源碼)
- SwiftUI一篇文章全面掌握Form(教程和源碼)
- SwiftUI Color 顏色一篇文章全解決
技術(shù)交流
QQ:3365059189
SwiftUI技術(shù)交流QQ群:518696470
- 請關(guān)注我的專欄icloudend, SwiftUI教程與源碼
http://www.itdecent.cn/c/7b3e3b671970