iOS - Swift NSTimer 定時器


前言

	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)
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM