GCD倒計時器速成

簡單介紹

1瞧壮、單例類管理GCD計時器;
2匙握、類方法調用計時器API咆槽,方便快捷;
3圈纺、提供三組API秦忿,快速實現(xiàn)計時麦射、倒計時、取消計時灯谣;
4违寞、目前僅提供同時存在1組計時器刚盈;
5男杈、計時結束后栏妖,自動取消,也可手動取消計時器呐萨;

注意事項

1杀饵、在頁面加載和退出時,注意定時器的銷毀谬擦。
2切距、及時調用銷毀方法,避免釋放不掉的問題惨远。
例如:

+ (void)cancelSingleTimer;

.h

構建回調block

/*
每秒頻單頻計時器回調
current 每秒回調一次 回調當前的時間
end 當為TRUE時 定時器結束
*/

typedef void (^DKTimerSingleTimerBlock)(NSInteger current, BOOL end);

/*
DKTimer
*/

@interface DKTimer : NSObject

/*
倒計時
time:從xx秒開始倒計時
block: 回調
*/

+ (void)countdown:(NSInteger)time block:(DKTimerSingleTimerBlock)block;

/*
計時
max:計時xx時間
block: 回調
*/

+ (void)singleTimer:(NSInteger)max block:(DKTimerSingleTimerBlock)block;

/*
取消計時
*/

+ (void)cancelSingleTimer;

.m

聲明屬性

/*
每秒頻單頻計時器谜悟;
每次調用前,會銷毀之前的定時器北秽;
支持計時和倒計時葡幸。倒計時到0時,停止計時贺氓;
回調的block均為主線程蔚叨;
*/

@property (strong, nonatomic) dispatch_source_t singleTimer;
@property (assign, nonatomic) NSInteger current;
@property (assign, nonatomic) NSInteger max;
@property (assign, nonatomic) BOOL sequence;
@property (copy, nonatomic) DKTimerSingleTimerBlock singleTimerBlock;

構建單例類

/*
單例類的創(chuàng)建
使用單例類創(chuàng)建定時器,在一定的環(huán)境下辙培,可以高效的控制定時器蔑水。
*/

+ (DKTimer *)timer {
    static dispatch_once_t onceToken;
    static DKTimer *timer = nil;
    dispatch_once(&onceToken, ^{
        timer = [[DKTimer alloc] init];
    });
    return timer;
}

公有API

/*
倒計時 最小從1開始倒計時
time:從xx秒開始倒計時
block: 回調
*/

+ (void)countdown:(NSInteger)time block:(DKTimerSingleTimerBlock)block {
    if (time <= 0) {
        return;
    }
    [DKTimer timer].singleTimerBlock = block;
    [DKTimer timer].sequence = NO;
    [DKTimer timer].current = time;
    [[DKTimer timer] startSingleTime];
}

/*
計時
max:計時xx時間
block: 回調
*/

+ (void)singleTimer:(NSInteger)max block:(DKTimerSingleTimerBlock)block {
    [DKTimer timer].singleTimerBlock = block;
    [DKTimer timer].sequence = YES;
    [DKTimer timer].max = max;
    [DKTimer timer].current = 0;
    [[DKTimer timer] startSingleTime];
}

/*
取消計時
*/

+ (void)cancelSingleTimer {
    [[DKTimer timer] stopSingleTimer];
}

私有API

/*
計時器的回調方法 主線程
*/

- (void)singleTimerMethod {
    if ([DKTimer timer].sequence) {
        // 計時
        [DKTimer timer].current = [DKTimer timer].current + 1;
        BOOL end;
        if ([DKTimer timer].current > [DKTimer timer].max) {
            // 結束
            end = YES;
            [self stopSingleTimer];
        }else {
            // 繼續(xù)
            end = NO;
        }
        if ([DKTimer timer].singleTimerBlock) {
            [DKTimer timer].singleTimerBlock([DKTimer timer].current, end);
        }
    }else {
        // 倒計時
        [DKTimer timer].current = [DKTimer timer].current - 1;
        BOOL end;
        if ([DKTimer timer].current < 0) {
            // 結束
            end = YES;
            [self stopSingleTimer];
        }else {
            // 繼續(xù)
            end = NO;
        }
        if ([DKTimer timer].singleTimerBlock) {
            [DKTimer timer].singleTimerBlock([DKTimer timer].current, end);
        }
    }
}

計時器創(chuàng)建 開始 銷毀

- (void)stopSingleTimer {
    if (_singleTimer) {
        dispatch_cancel(_singleTimer);
        _singleTimer = nil;
    }
}
- (void)startSingleTime {
    [self stopSingleTimer];
    __weak DKTimer *weakself = self;
    NSInteger timeSpace = 1;
    dispatch_queue_t queue = dispatch_get_main_queue();
    self.singleTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC));
    uint64_t interval = (uint64_t)(timeSpace * NSEC_PER_SEC);
    dispatch_source_set_timer(self.singleTimer, start, interval, 0);
    dispatch_source_set_event_handler(self.singleTimer, ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            [weakself singleTimerMethod];
        });
    });
    dispatch_resume(self.singleTimer);
}

IMG_2847.jpg
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市扬蕊,隨后出現(xiàn)的幾起案子搀别,更是在濱河造成了極大的恐慌,老刑警劉巖尾抑,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歇父,死亡現(xiàn)場離奇詭異,居然都是意外死亡再愈,警方通過查閱死者的電腦和手機榜苫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翎冲,“玉大人垂睬,你說我怎么就攤上這事。” “怎么了羔飞?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長檐春。 經常有香客問我逻淌,道長,這世上最難降的妖魔是什么疟暖? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任卡儒,我火速辦了婚禮,結果婚禮上俐巴,老公的妹妹穿的比我還像新娘骨望。我一直安慰自己,他們只是感情好欣舵,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布擎鸠。 她就那樣靜靜地躺著,像睡著了一般缘圈。 火紅的嫁衣襯著肌膚如雪劣光。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天糟把,我揣著相機與錄音绢涡,去河邊找鬼。 笑死遣疯,一個胖子當著我的面吹牛雄可,可吹牛的內容都是我干的。 我是一名探鬼主播缠犀,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼数苫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了夭坪?” 一聲冷哼從身側響起文判,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎室梅,沒想到半個月后戏仓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡亡鼠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年赏殃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片间涵。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡仁热,死狀恐怖,靈堂內的尸體忽然破棺而出勾哩,到底是詐尸還是另有隱情抗蠢,我是刑警寧澤举哟,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站迅矛,受9級特大地震影響妨猩,放射性物質發(fā)生泄漏。R本人自食惡果不足惜秽褒,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一壶硅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧销斟,春花似錦庐椒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至犁钟,卻和暖如春窗宇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背特纤。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工军俊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捧存。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓粪躬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親昔穴。 傳聞我的和親對象是個殘疾皇子镰官,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內容