iOS 定時器

iOS裏面使用的定時器類型通常有三種NSTimer、CADisplayLink、GCD。oop

 

一、最精準的定時器 - GCDatom

#import "ViewController.h"

@interface ViewController ()
// 必需要有強引用,否則對象會被釋放
@property (nonatomic , strong) dispatch_source_t timer ;
@end

@implementation ViewController

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    NSLog(@"__%s__",__func__);

#warning 重複執行的GCD定時器

    // 一、基於GCD的定時器,建立timer對象:
    // 參數一:source的類型DISPATCH_SOURCE_TYPE_TIMER 表示定時器類型
    // 參數二:描述內容,好比線程ID
    // 參數三:詳細描述內容
    // 參數四:隊列,決定GCD的隊列在哪一個線程執行
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));

    // 二、基於GCD的定時器,建立timer對象:
    // 參數一:定時器對象timer
    // 參數二:起始時間,DISPATCH_TIME_NOW表示從如今開始
    // 參數三:多少時間內執行
    // 參數四:精準度 絕對精準爲0
    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);

    // 三、執行內容
    dispatch_source_set_event_handler(timer, ^{
        NSLog(@"===%@===",[NSThread currentThread]);
    });
    // 四、啓動執行
    dispatch_resume(timer);
    // 五、增長強引用
    self.timer = timer;

#warning 執行一次的GCD定時器

    // 1. 延遲幾秒後執行
    double delayInSeconds = 2.0;
    // 2. 建立dispatch_time_t類對象
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
    // 3. 幾秒後實際執行的事件
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
        //執行事件
    });

}
@end

 

二、最簡單的定時器 - NSTimerspa

// 建立定時器
NSTimer *timer = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];

// 將定時器加入RUNLOOP的運行循環
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

 

三、最適合作界面渲染的定時器 - CSDisplayLink 線程

// 1. 建立方法
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];    
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

// 2. 中止方法
[self.displayLink invalidate];  
self.displayLink = nil;
         
/**當把CADisplayLink對象add到runloop中後,selector就能被週期性調用,相似於重複的NSTimer被啓動了;執行invalidate操做時,CADisplayLink對象就會從runloop中移除,selector調用也隨即中止,相似於NSTimer的invalidate方法。**/

// 重要的屬性:
// frameInterval:NSInteger類型的值,用來設置間隔多少幀調用一次selector方法,默認值是1,即每幀都調用一次。
// duration:readOnly的CFTimeInterval值,表示兩次屏幕刷新之間的時間間隔。須要注意的是,該屬性在target的selector被首次調用之後纔會被賦值。selector的調用間隔時間計算方式是:調用間隔時間 = duration × frameInterval。
相關文章
相關標籤/搜索