使用開源庫 EasyTimeline 操做定時器 NSTimer

EasyTimelinegit

https://github.com/mmislam101/EasyTimelinegithub

Sometimes you need things to happen at specific times and things.app

When it's just an event 2.0 seconds later, a performSelector:withObject:afterDelay: is perfect.oop

If it gets a little more complex where you need something happening ever 3.0 seconds, a quick implementation of NSTimer is good.ui

But what if you want something to happen every 2 seconds and then at the 7th second something else to happen. Or if you want to pause everything for a while and then resume later?spa

有時候,你須要確保一些事件在指定的時間點上發生.3d

僅僅只是想在第2秒的時候觸發一個事件,這個方法performSelector:withObject:afterDelay:就夠了.code

稍微複雜點,你須要事件每3秒觸發一次,這個NSTimer也很好用.orm

可是呢,若是你想着,這個事件每2秒觸發一次,而後在第7秒的時候又觸發一次,或者這麼說吧,你想中止這個定時器一下子,以後在激活它,繼續運行下去,咋搞?blog

簡單的分析下圖:

Tick Events 爲定時觸發的事件,對應於tickPeriod.

Special Events 爲特殊觸發的事件,由方法addEvent:添加,使得事件在指定的時間點上運行.

That's where Easy Timeline comes into play.

別急,這就是 Easy Timeline 要乾的活,哥們.

注:EasyTimeline運行於ARC下,本人研究其demo後,進行簡單的分享

1. 下載源碼,把 EasyTimeline 文件夾拖入工程項目中,引入頭文件 EasyTimeline.h

2. 使用詳情

每0.5s觸發一次事件

    // 初始化定時器
    EasyTimeline  *timeline = [[EasyTimeline alloc] init];
    
    // 設置定時器爲永久啓動
    timeline.willLoop = YES;
    
    // 設置觸發事件的最高時長(開啓willLoop後此設置的值無效,大於0便可)
    timeline.duration = 0.1;
    
    // 觸發事件的事件間隔爲 0.5 s
    timeline.tickPeriod = 0.5;
    
    // 事件觸發後會進入以下block
    timeline.tickBlock = ^void (NSTimeInterval time, EasyTimeline *timeline) {
        NSLog(@"%f", time);
    };
    
    // 開啓定時器
    [timeline start];

每0.5s觸發一次事件,5s後暫停定時器

注:一旦暫停後,全部的這個時間線上的事件都暫停了

    // 初始化定時器
    EasyTimeline  *timeline = [[EasyTimeline alloc] init];
    
    // 設置定時器爲永久啓動
    timeline.willLoop = YES;
    
    // 設置觸發事件的最高時長(開啓willLoop後此設置的值無效,大於0便可)
    timeline.duration = 0.1;
    
    // 觸發事件的事件間隔爲 0.5 s
    timeline.tickPeriod    = 0.5;
    
    // 事件觸發後會進入以下block
    timeline.tickBlock = ^void (NSTimeInterval time, EasyTimeline *timeline) {
        NSLog(@"%f", time);
        
        // 5秒後暫停定時器
        if (time > 5) {
            [timeline pause];
        }
    };
    
    // 開啓定時器
    [timeline start];

每0.5s觸發一次事件,5s設置定時器爲每3.0s觸發一次事件

    // 初始化定時器
    EasyTimeline  *timeline = [[EasyTimeline alloc] init];
    
    // 設置定時器爲永久啓動
    timeline.willLoop = YES;
    
    // 設置觸發事件的最高時長(開啓willLoop後此設置的值無效,大於0便可)
    timeline.duration = 0.1;
    
    // 觸發事件的事件間隔爲 0.5 s
    timeline.tickPeriod    = 0.5;
    
    // 事件觸發後會進入以下block
    timeline.tickBlock = ^void (NSTimeInterval time, EasyTimeline *timeline) {
        
        NSLog(@"%f", time);
        
        // 5秒後設置事件時間間隔爲 3.0 s
        if (time > 5) {
            timeline.tickPeriod = 3.0;
        }
    };
    
    // 開啓定時器
    [timeline start];

每4.0s觸發一次事件,第5.0s時觸發一次事件

    // 初始化定時器
    EasyTimeline  *timeline = [[EasyTimeline alloc] init];
    
    // 設置定時器爲永久啓動
    timeline.willLoop = YES;
    
    // 設置觸發事件的最高時長(開啓willLoop後此設置的值無效,大於0便可)
    timeline.duration = 0.1;
    
    // 觸發事件的事件間隔爲 4.0 s
    timeline.tickPeriod    = 4.0;
    
    // 事件觸發後會進入以下block
    timeline.tickBlock = ^void (NSTimeInterval time, EasyTimeline *timeline) {
        
        NSLog(@"%f", time);
    };
    
    // 在時間線上的第 5.0s 時插入一個事件
    [timeline addEvent:[EasyTimelineEvent eventAtTime:5.0 withEventBlock:^(EasyTimelineEvent *event, EasyTimeline *timeline) {
        NSLog(@"Y.X.");
    }]];
    
    // 開啓定時器
    [timeline start];

每0.5s觸發一次事件,第5.0s時中止,延時5.0s後繼續觸發事件

#pragma mark - GCD延時
- (void)delayTime:(int64_t)seconds inQueue:(dispatch_queue_t)queue
            block:(void (^)(dispatch_queue_t queue))block
{
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, seconds * NSEC_PER_SEC);
    dispatch_after(popTime, queue, ^(void){
        block(queue);
    });
}

    // 初始化定時器
    EasyTimeline  *timeline = [[EasyTimeline alloc] init];
    
    // 設置定時器爲永久啓動
    timeline.willLoop = YES;
    
    // 設置觸發事件的最高時長(開啓willLoop後此設置的值無效,大於0便可)
    timeline.duration = 0.1;
    
    // 觸發事件的事件間隔爲 0.5 s
    timeline.tickPeriod    = 0.5;
    
    // 事件觸發後會進入以下block
    timeline.tickBlock = ^void (NSTimeInterval time, EasyTimeline *timeline) {
        
        NSLog(@"%f", time);
        
        if (time > 5.0)
        {
            static int flag = 0;
            if (flag == 0)
            {
                // 暫停時間線
                [timeline pause];
                flag = !flag;
            }

            // GCD 延時 5s 後恢復時間線
            [self delayTime:5 inQueue:dispatch_get_main_queue() block:^(dispatch_queue_t queue) {
                [timeline resume];
            }];
            
        }
    };
    
    // 開啓定時器
    [timeline start];

每1.0s觸發一次事件,第5秒時跳過去3.0s(本人試驗過,不知道有啥用)

    // 初始化定時器
    EasyTimeline  *timeline = [[EasyTimeline alloc] init];
    
    // 設置定時器爲永久啓動
    timeline.willLoop = YES;
    
    // 設置觸發事件的最高時長(開啓willLoop後此設置的值無效,大於0便可)
    timeline.duration = 0.1;
    
    // 觸發事件的事件間隔爲 1.0 s
    timeline.tickPeriod    = 1.0;
    
    // 事件觸發後會進入以下block
    timeline.tickBlock = ^void (NSTimeInterval time, EasyTimeline *timeline) {
        
        NSLog(@"%f", time);
        
        if (time > 5.0) {
            static int flag = 0;
            if (flag == 0) {
                flag = !flag;
                
                [timeline skipForwardSeconds:3.0];
            }
        }
    };
    
    // 開啓定時器
    [timeline start];

心得:

該時間線能夠暫停,能夠恢復,能夠在指定的時間點上觸發事件,在運行中能夠隨時調整觸發事件的時間間隔,完爆系統自帶的NSTimer,且很是易於理解,很是好用.

相關文章
相關標籤/搜索