IOS 定時器總結(jié)

轉(zhuǎn)自: iOS中幾種定時器 - 控制了時間炕泳,就控制了一切

定時器三種方法:

  1. NSTimer
  2. CADisplayLink
  3. GCD方式

一、NSTimer


1.1 基本使用方法

1.1.1 創(chuàng)建

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(action:) userInfo:nil repeats:NO];
  • TimerInterval : 執(zhí)行之前等待的時間搂抒。比如設(shè)置成1.0,就代表1秒后執(zhí)行方法
  • target : 需要執(zhí)行方法的對象兔沃。
  • selector : 需要執(zhí)行的方法
  • repeats : 是否需要循環(huán)

1.1.2 開始/停止/釋放

開始:
[timer setFireDate:[NSDate distantPast]];
停止:
[timer setFireDate:[NSDate distantFuture]];
釋放:
[timer invalidate];

注意 :
調(diào)用創(chuàng)建方法后狡逢,target對象的計數(shù)器會加1,直到執(zhí)行完畢棚亩,自動減1蓖议。如果是循環(huán)執(zhí)行的話虏杰,就必須手動關(guān)閉,否則可以不執(zhí)行釋放方法勒虾。

1.2 特性

  • 存在延遲
    不管是一次性的還是周期性的timer的實際觸發(fā)事件的時間纺阔,都會與所加入的RunLoop和RunLoop Mode有關(guān),如果此RunLoop正在執(zhí)行一個連續(xù)性的運算修然,timer就會被延時出發(fā)笛钝。重復(fù)性的timer遇到這種情況,如果延遲超過了一個周期愕宋,則會在延時結(jié)束后立刻執(zhí)行玻靡,并按照之前指定的周期繼續(xù)執(zhí)行。

  • 必須加入Runloop
    使用上面的創(chuàng)建方式中贝,會自動把timer加入MainRunloop的NSDefaultRunLoopMode中囤捻。如果使用以下方式創(chuàng)建定時器,就必須手動加入Runloop:

NSTimer *timer = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

二邻寿、CADisplayLink


2.1. 創(chuàng)建方法

self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];    
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

2.2 停止方法

[self.displayLink invalidate];  
self.displayLink = nil;

2.3 特性

  • 屏幕刷新時調(diào)用
    CADisplayLink是一個能讓我們以和屏幕刷新率同步的頻率將特定的內(nèi)容畫到屏幕上的定時器類。CADisplayLink以特定模式注冊到runloop后淀弹,每當屏幕顯示內(nèi)容刷新結(jié)束的時候,runloop就會向CADisplayLink指定的target發(fā)送一次指定的selector消息庆械, CADisplayLink類對應(yīng)的selector就會被調(diào)用一次薇溃。所以通常情況下,按照iOS設(shè)備屏幕的刷新率60次/秒
  • 延遲
    iOS設(shè)備的屏幕刷新頻率是固定的缭乘,CADisplayLink在正常情況下會在每次刷新結(jié)束都被調(diào)用沐序,精確度相當高。但如果調(diào)用的方法比較耗時堕绩,超過了屏幕刷新周期策幼,就會導(dǎo)致跳過若干次回調(diào)調(diào)用機會。
    如果CPU過于繁忙奴紧,無法保證屏幕60次/秒的刷新率特姐,就會導(dǎo)致跳過若干次調(diào)用回調(diào)方法的機會,跳過次數(shù)取決CPU的忙碌程度黍氮。
  • 使用場景
    從原理上可以看出唐含,CADisplayLink適合做界面的不停重繪浅浮,比如視頻播放的時候需要不停地獲取下一幀用于界面渲染。

2.4 重要屬性

  • frameInterval
    NSInteger類型的值捷枯,用來設(shè)置間隔多少幀調(diào)用一次selector方法滚秩,默認值是1,即每幀都調(diào)用一次淮捆。
  • duration
    readOnly的CFTimeInterval值郁油,表示兩次屏幕刷新之間的時間間隔。需要注意的是攀痊,該屬性在target的selector被首次調(diào)用以后才會被賦值已艰。selector的調(diào)用間隔時間計算方式是:調(diào)用間隔時間 = duration × frameInterval。

三蚕苇、GCD方式


  • 執(zhí)行一次
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    //執(zhí)行事件
});
  • 重復(fù)執(zhí)行
NSTimeInterval period = 1.0; //設(shè)置時間間隔
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), period * NSEC_PER_SEC, 0); //每秒執(zhí)行
dispatch_source_set_event_handler(_timer, ^{
    //在這里執(zhí)行事件
});
dispatch_resume(_timer);

GCD的方式哩掺,我在網(wǎng)上只能找到這些資料,目前自己還在學(xué)習(xí)中涩笤,以后會更新

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嚼吞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蹬碧,更是在濱河造成了極大的恐慌舱禽,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恩沽,死亡現(xiàn)場離奇詭異誊稚,居然都是意外死亡,警方通過查閱死者的電腦和手機罗心,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門里伯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人渤闷,你說我怎么就攤上這事疾瓮。” “怎么了飒箭?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵狼电,是天一觀的道長。 經(jīng)常有香客問我弦蹂,道長肩碟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任凸椿,我火速辦了婚禮削祈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘削饵。我一直安慰自己岩瘦,他們只是感情好未巫,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著启昧,像睡著了一般叙凡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上密末,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天握爷,我揣著相機與錄音,去河邊找鬼严里。 笑死新啼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的刹碾。 我是一名探鬼主播燥撞,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼迷帜!你這毒婦竟也來了物舒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤戏锹,失蹤者是張志新(化名)和其女友劉穎冠胯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锦针,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡荠察,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了奈搜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悉盆。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖媚污,靈堂內(nèi)的尸體忽然破棺而出舀瓢,到底是詐尸還是另有隱情,我是刑警寧澤耗美,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站航缀,受9級特大地震影響商架,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芥玉,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一蛇摸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧灿巧,春花似錦赶袄、人聲如沸揽涮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒋困。三九已至,卻和暖如春敬辣,著一層夾襖步出監(jiān)牢的瞬間雪标,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工溉跃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留村刨,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓撰茎,卻偏偏與公主長得像嵌牺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子龄糊,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • 一、NSTimer1.創(chuàng)建方法 TimerInterval : 執(zhí)行之前等待的時間懈糯。比如設(shè)置成1.0润樱,就代表1秒后...
    心至靜行至遠閱讀 2,566評論 0 5
  • 在軟件開發(fā)過程中,我們常常需要在某個時間后執(zhí)行某個方法爸舒,或者是按照某個周期一直執(zhí)行某個方法蟋字。在這個時候,我們就需要...
    誰遇而安閱讀 20,933評論 2 20
  • 調(diào)用一次計時器方法: [cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片 myTime...
    3ad997c871e9閱讀 711評論 0 1
  • 定時器扭勉,用來延遲或重復(fù)執(zhí)行某些方法鹊奖,例如:網(wǎng)絡(luò)定時刷新,UI間隔刷新涂炎,動畫效果......iOS中的定時器大致分為...
    sweetpf閱讀 731評論 1 2
  • “慈母手中線忠聚,游子身上衣。臨行密密縫唱捣,意恐遲遲歸两蟀。誰言寸草心,報得三春暉震缭÷柑海” 以前小學(xué)語文老師在講解孟郊的這首詩時...
    米素文閱讀 1,702評論 2 13