Objective-C 編程:NSTimer

定時(shí)器:讓程序定時(shí)執(zhí)行某一個(gè)方法蹄殃。

用 NSTimer 封裝的定時(shí)器示例

MyTimeCounter.h 文件

#import <Foundation/Foundation.h>

@protocol MyTimeCounterDelegate <NSObject>
// 外部調(diào)用這個(gè)類需要實(shí)現(xiàn)的代理方法,用于返回當(dāng)前計(jì)時(shí)的時(shí)間
-(void)currentTime:(NSUInteger)time;
@end

// 自定義的定時(shí)器類
@interface MyTimeCounter : NSObject

@property (nonatomic, strong) id<PATimeCounterDelegate>delegate;

- (void)start;
- (void)stop;
- (void)pause;
- (void)continue;

@end

MyTimeCounter.m 文件

#import "MyTimeCounter.h"

@interface MyTimeCounter()

@property (nonatomic, assign) NSUInteger count; // 全局屬性川蒙,用于記錄當(dāng)前的秒數(shù)
@property (nonatomic, strong) NSTimer *timer;

@end

@implementation MyTimeCounter

// 開始計(jì)時(shí)
- (void)start {
    [self start]; // 重置計(jì)時(shí)器
    
    /* 方法作用:每隔1秒執(zhí)行指定方法
     *
     * 參數(shù)說(shuō)明:
     * TimeInterval : 執(zhí)行之前等待的時(shí)間。比如設(shè)置成 1.0清酥,就代表 1 秒后執(zhí)行方法寒匙。
     * target : 需要執(zhí)行方法的對(duì)象罕偎。
     * selector : 需要執(zhí)行的方法。
     * userInfo : 用戶信息
     * repeats : 是否需要循環(huán)
     */
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0f
                                                  target:self
                                                selector:@selector(repeatShowTime:)
                                                userInfo:nil
                                                 repeats:YES];
}

- (void)repeatShowTime:(NSTimer *)tempTimer {
    _count ++;
    
    // 返回當(dāng)前記錄的時(shí)間
    if (_delegate && [_delegate respondsToSelector:@selector(currentTime:)]) {
        [_delegate currentTime:_count];
    }
}

// 停止計(jì)時(shí)
- (void)stop {
    // 如果已經(jīng)存在 timer 對(duì)象陌知,則釋放
    if (self.timer) {
        [self.timer invalidate]; // 釋放計(jì)時(shí)器
        self.timer = nil;
    }
    _count = 0;
}

// 暫停
- (void)pause {
    [self.timer setFireDate:[NSDate distantFuture]];
}

// 繼續(xù)
- (void)continue {
    [self.timer setFireDate:[NSDate date]];
}

// 銷毀
- (void)dealloc {
    if (self.timer) {
        [self.timer invalidate];
        self.timer = nil;
    }
}

@end

外部調(diào)用

#import "MyTimeCounter.h"

// 默認(rèn)倒計(jì)時(shí) 15s
static int const KCountDown = 15;

//...

@property (nonatomic, strong) MyTimeCounter *timeManager; // 倒計(jì)時(shí)管理器

//...

// Lazy loading
- (PATimeCounter *)timeManager{
    if (!_timeManager) {
        _timeManager = [[PATimeCounter alloc] init];
        _timeManager.delegate = self;
    }
    return _timeManager;
}

- (void)myFunction {
  [self.timeManager start]; // 開始倒計(jì)時(shí)
  
  // ...
  
  [self.timeManager stop]; // 結(jié)束倒計(jì)時(shí)
}

#pragma mark - MyTimeCounterDelegate

// 倒計(jì)時(shí)管理器
- (void)currentTime:(NSUInteger)time {
    if (time != KCountDown) {
        // 主線程更新 UI
        __weak __typeof(self)weakSelf = self;
        dispatch_async(dispatch_get_main_queue(), ^{
            weakSelf.timeLabel.text = [NSString stringWithFormat:@"%d", KCountDown - time];
        });
    } else {
        _isTimeOut = YES;
    }
}

通過 GCD 實(shí)現(xiàn)的 60s 倒計(jì)時(shí)示例

// 重復(fù)執(zhí)行事件
__block int timeout = 60; // 倒計(jì)時(shí)時(shí)間
NSTimeInterval intervalInSeconds = 1.0; // 執(zhí)行時(shí)間間隔他托,1秒

// 全局隊(duì)列
dispatch_queue_t queue = dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0);

// 計(jì)時(shí)器
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, intervalInSeconds * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
dispatch_source_set_event_handler(timer, ^{
    // 執(zhí)行的事件
    if (timeout <= 0) {
        dispatch_source_cancel(timer);
        dispatch_async(dispatch_get_main_queue(), ^{
            // 主隊(duì)列執(zhí)行
            
        });
    } else {
        dispatch_async(dispatch_get_main_queue(), ^{
            // 主隊(duì)列執(zhí)行
            
        });
    }
    timeout --;
});
dispatch_resume(timer);

開源的第三方框架

參考 GitHub:https://github.com/search?q=iOS+Countdown

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赏参,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子沿盅,更是在濱河造成了極大的恐慌把篓,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腰涧,死亡現(xiàn)場(chǎng)離奇詭異韧掩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)窖铡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門疗锐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人万伤,你說(shuō)我怎么就攤上這事窒悔。” “怎么了敌买?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵简珠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng)聋庵,這世上最難降的妖魔是什么膘融? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮祭玉,結(jié)果婚禮上氧映,老公的妹妹穿的比我還像新娘。我一直安慰自己脱货,他們只是感情好岛都,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著振峻,像睡著了一般臼疫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扣孟,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天烫堤,我揣著相機(jī)與錄音,去河邊找鬼凤价。 笑死鸽斟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的利诺。 我是一名探鬼主播富蓄,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼立轧!你這毒婦竟也來(lái)了格粪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤氛改,失蹤者是張志新(化名)和其女友劉穎帐萎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胜卤,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疆导,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了葛躏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澈段。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖舰攒,靈堂內(nèi)的尸體忽然破棺而出败富,到底是詐尸還是另有隱情,我是刑警寧澤摩窃,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布兽叮,位于F島的核電站芬骄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鹦聪。R本人自食惡果不足惜账阻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泽本。 院中可真熱鬧淘太,春花似錦、人聲如沸规丽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嘁捷。三九已至造成,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雄嚣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工喘蟆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缓升,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓蕴轨,卻偏偏與公主長(zhǎng)得像港谊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子橙弱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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

  • Runloop定時(shí)器的應(yīng)用及關(guān)閉iOS NSTimer 定時(shí)器用法總結(jié) 1.定時(shí)器的創(chuàng)建 參數(shù)1:時(shí)間間隔(定時(shí)的...
    Barry_小閃閱讀 296評(píng)論 0 0
  • 一. NSTimer NSTimer的初始化方法有以下幾種: 會(huì)自動(dòng)啟動(dòng), 并加入* MainRunloop*的*...
    codeshow閱讀 504評(píng)論 0 0
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)歧寺、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評(píng)論 4 62
  • 我這個(gè)人吧棘脐,最喜歡一時(shí)興起斜筐,當(dāng)然我也知道,我不把自己的思緒理一理蛀缝,特別容易被情緒或別人帶偏顷链。那么,我的瑜伽之路整理...
    曾曾的麻麻閱讀 231評(píng)論 1 1
  • 早餐是一天中最關(guān)鍵的進(jìn)餐時(shí)段,關(guān)系到人一天的精氣神是否充沛在讶,所以只有吃好早餐才能保證有良好的精神狀態(tài)工作煞抬,所以早餐...
    美麗大霞閱讀 480評(píng)論 0 0