前言
public class NSTimer : NSObject
- 作用
- 在指定的時間執行指定的任務。
- 每隔一段時間執行指定的任務。
1、定時器的創建
-
當定時器創建完(不用 scheduled 的,添加到 runloop 中)后,該定時器將在初始化時指定的 ti 秒后自動觸發。
-
scheduled 方式:
-
創建並啟動定時器。
-
默認將時鍾以 NSDefaultRunLoopMode 模式添加到運行循環。
-
發生用戶交互的時候,時鍾會被暫停。
/* public class func scheduledTimerWithTimeInterval(ti: NSTimeInterval, target aTarget: AnyObject, selector aSelector: Selector, userInfo: AnyObject?, repeats yesOrNo: Bool) -> NSTimer 參數: TimeInterval:觸發時間,單位秒 target:定時起觸發對象 selector:定時器響應方法 userInfo:用戶信息 repeats:是否重復執行,YES 每個指定的時間重復執行,NO 只執行一次 */ // 創建並啟動定時器 let timer:NSTimer = NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: #selector(ViewController.updateTimer(_:)), userInfo: nil, repeats: true)
-
-
timer 方式:
-
創建定時器,添加到運行循環后啟動定時器。
-
將時鍾以指定的模式添加到運行循環。
/* + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo; - (void)addTimer:(NSTimer *)timer forMode:(NSString *)mode; mode: NSDefaultRunLoopMode: 時鍾,網絡。 發生用戶交互的時候,時鍾會被暫停 NSRunLoopCommonModes: 用戶交互,響應級別高。 發生用戶交互的時候,時鍾仍然會觸發,如果時鍾觸發方法非常 耗時,使用此方式時用戶操作會造成非常嚴重的卡頓。 */ // 創建定時器 let timer:NSTimer = NSTimer(timeInterval: 2.0, target: self, selector: #selector(ViewController.updateTimer(_:)), userInfo: nil, repeats: true) // 將定時器添加到運行循環 NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
-
2、定時器的啟動與關閉
// 啟動定時器
timer.fireDate = NSDate.distantFuture()
// 暫停定時器
timer.fireDate = NSDate.distantPast()
// 關閉定時器,永久關閉定時器
timer.invalidate()
3、子線程定時器的創建
-
在子線程創建定時器時,需要手動開啟子線程的運行循環。
dispatch_async(dispatch_get_global_queue(0, 0)) { // 在子線程創建定時器 /* scheduled 或 timer 方式創建 */ let timer:NSTimer = NSTimer(timeInterval: 2.0, target: self, selector: #selector(ViewController.updateTimer(_:)), userInfo: nil, repeats: true) NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes) // 啟動子線程的運行循環 /* 這句代碼就是一個死循環!如果不停止運行循環,不會執行添加到此句之后的任何代碼 */ CFRunLoopRun() // 停止子線程運行循環之前,不會執行添加到此處的任何代碼 }
var num:Int = 0 func updateTimer(timer:NSTimer) { num = num + 1 // 滿足條件后,停止當前的運行循環 if (num == 8) { // 停止當前的運行循環 /* 一旦停止了運行循環,后續代碼能夠執行,執行完畢后,線程被自動銷毀 */ CFRunLoopStop(CFRunLoopGetCurrent()) } }
4、定時任務
-
1)performSelector
// 延時調用 /* 1.5 秒后自動調用 self 的 hideHUD 方法 */ self.performSelector(#selector(NsTimer.hideHUD), withObject: nil, afterDelay: 1.5) // 取消延時調用 NSObject.cancelPreviousPerformRequestsWithTarget(self, selector: #selector(NsTimer.hideHUD), object: nil)
-
2)GCD
// 多線程 /* 1.5 秒后自動執行 block 里面的代碼 */ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(1.5 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { self.hud.alpha = 0.0; }
-
3)NSTimer
// 定時器 /* 1.5 秒后自動調用 self 的 hideHUD 方法 */ NSTimer.scheduledTimerWithTimeInterval(1.5, target: self, selector: #selector(NsTimer.hideHUD), userInfo: nil, repeats: false)