iOS-GCD定時器的使用

在iOS開發(fā)的過程中定時器的使用比較頻繁的,比較常見的場景是驗證碼的發(fā)送,或者是倒計時的展示.一般的需求我們直接使用NSTimer就能完成炊琉。但是NSTimer的坑也是比較多的,比如在UITableview的時候,需要把NSTimer添加到主循環(huán)苔咪,并且設(shè)置為NSRunLoopCommonModes锰悼。但是今天要記錄的是:GCD定時器

先直接貼代碼

File:GCDCountDown.h

@interface GCDCountDown()
@property(nonatomic,strong)dispatch_source_t timer;
+(instancetype)manager;
-(void)resume;
-(void)pause;
@end
*************************************************************************************

File:GCDCountDown.m

@implementation GCDCountDown
+(instancetype)manager{
    static GCDCountDown *countDown = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (countDown == nil) {
            countDown = [[GCDCountDown alloc]init];
        }
    });
    
    return countDown;
}

-(instancetype)init{
    self = [super init];
    if (self) {
        [self loadTimer];
    }
    return self;
}

//定時器設(shè)置
-(void)loadTimer{
    if (self.timer) {
        dispatch_cancel(self.timer);
        self.timer = nil;
    }
    
    
    dispatch_queue_t queue = dispatch_get_main_queue();
    //創(chuàng)建一個定時器(dispatch_source_t本質(zhì)上還是一個OC對象)
    self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    
    //設(shè)置定時器的各種屬性
    dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0*NSEC_PER_SEC));
    uint64_t interval = (uint64_t)(1.0*NSEC_PER_SEC);
    dispatch_source_set_timer(self.timer, start, interval, 0);
    
    
    //設(shè)置回調(diào)
    __weak typeof(self) weakSelf = self;
    dispatch_source_set_event_handler(self.timer, ^{
        //定時器需要執(zhí)行的操作
        [weakSelf timerAction];
       
    });
    //啟動定時器(默認(rèn)是暫停)
    dispatch_resume(self.timer);
    
}

-(void)resume{
    //重新加載一次定時器
    [self loadTimer];
    
}
-(void)pause{
    if (self.timer) {
        dispatch_cancel(self.timer);
        self.timer = nil;
    }
    
}

@end

這是為了適配項目的需求封裝的一個簡單的定時器單例,精簡了一些業(yè)務(wù)代理团赏,不過主要的用法都貼出來了箕般。GCD定時器的定義和使用就是這么簡單,但是其中有幾點是需要說明的:

  • dispatch_source_t 在本質(zhì)上是一個對象,所以我們使用強引用舔清。我們可以點擊dispatch_source_t跳轉(zhuǎn)到source.h文件看到丝里,改對象使用宏定義,進行了一系列操作定義對象鸠踪。
    dispatch_source_t展開后的定義是:

@protocol OS_dispatch_source <OS_dispatch_object>
@end
typedef NSObject<OS_dispatch_source>* dispatch_source_t

也就是dispatch_source_t 就是一個NSObjective對象。對于想深入了解的同學(xué)自行百度(主要是本人實在沒有那么多精力看源碼)

  • 定時器的暫停使用的是:dispatch_cancel(self.timer) 很明顯這個我們可以清楚得看到也是一個宏定義,至于他的內(nèi)部操作,請參考上一句話
  • 相對于NSTimer來說GCD定時器更加精確,并且不用考慮運行模式,因為NSTimer其實是延遲把事件放到RunLoop中執(zhí)行,如果遇到其他的事件導(dǎo)致NSTimer的事件執(zhí)行錯過了運行周期,就會導(dǎo)致NSTimer的事件要到下一個周期才能運行复斥。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末营密,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子目锭,更是在濱河造成了極大的恐慌评汰,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痢虹,死亡現(xiàn)場離奇詭異被去,居然都是意外死亡,警方通過查閱死者的電腦和手機奖唯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門惨缆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丰捷,你說我怎么就攤上這事坯墨。” “怎么了病往?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵捣染,是天一觀的道長。 經(jīng)常有香客問我停巷,道長耍攘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任畔勤,我火速辦了婚禮蕾各,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘庆揪。我一直安慰自己示损,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布嚷硫。 她就那樣靜靜地躺著检访,像睡著了一般始鱼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脆贵,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天医清,我揣著相機與錄音,去河邊找鬼卖氨。 笑死会烙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的筒捺。 我是一名探鬼主播柏腻,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼系吭!你這毒婦竟也來了五嫂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤肯尺,失蹤者是張志新(化名)和其女友劉穎沃缘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體则吟,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡槐臀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了氓仲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片水慨。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖敬扛,靈堂內(nèi)的尸體忽然破棺而出讥巡,到底是詐尸還是另有隱情,我是刑警寧澤舔哪,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布欢顷,位于F島的核電站,受9級特大地震影響捉蚤,放射性物質(zhì)發(fā)生泄漏抬驴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一缆巧、第九天 我趴在偏房一處隱蔽的房頂上張望布持。 院中可真熱鬧,春花似錦陕悬、人聲如沸题暖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胧卤。三九已至唯绍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枝誊,已是汗流浹背况芒。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叶撒,地道東北人绝骚。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像祠够,于是被迫代替她去往敵國和親压汪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 29,321評論 8 265
  • 最近看了一下 iOS 的定時器的使用古瓤,我們來模擬一個發(fā)送短信驗證碼時候的等待計時動畫 要想了解定時器止剖,首先需要了解...
    TomatosX閱讀 1,139評論 0 0
  • OC語言基礎(chǔ) 1.類與對象 類方法 OC的類方法只有2種:靜態(tài)方法和實例方法兩種 在OC中,只要方法聲明在@int...
    奇異果好補閱讀 4,250評論 0 11
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,089評論 1 32
  • 一:base.h 二:block.h 1. dispatch_block_flags:DISPATCH_BLOCK...
    小暖風(fēng)閱讀 2,409評論 0 0