iOS中如何实现准确的倒计时程序 · 九十里

Posted lijianming180

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS中如何实现准确的倒计时程序 · 九十里相关的知识,希望对你有一定的参考价值。

ios中倒计时程序,考虑线程暂停场景。

iOS App进入后台时,GCD线程也会跟着暂停。当程序进入前台后,GCD线程恢复。因而倒计时程序需要考虑这一点,通过加入时间的比对来实现。

+ (void)countDownWithLapseTime:(int)lapseTime andBlock:(void(^)(int timeLapse)) countDownBlock{
    __block dispatch_source_t timer;
    NSTimeInterval timeInterval=lapseTime;
    NSDate *startTime = [NSDate date];
    
    if (timer==nil) {
        __block int timeout = timeInterval; //倒计时时间
        
        if (timeout!=0) {
            dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
            timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
            dispatch_source_set_timer(timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行
            dispatch_source_set_event_handler(timer, ^{
   大专栏  iOS中如何实现准确的倒计时程序 · 九十里              if(timeout<=0){ //倒计时结束,关闭
                    dispatch_source_cancel(timer);
                    timer = nil;
                    dispatch_async(dispatch_get_main_queue(), ^{
                        countDownBlock(timeout);
                    });
                }else{
                    timeout--;

                    NSDate *currentDate = [NSDate date];
                    int leftTime = timeInterval - ((int)(currentDate.timeIntervalSince1970 - startTime.timeIntervalSince1970));
                    if((timeout - leftTime) > 1) //如果真实计时和倒计数计时差别大于1秒,则同步。
                        timeout = leftTime;

                    
                    //回主线程执行countDownBlock
                    dispatch_async(dispatch_get_main_queue(), ^{
                        countDownBlock(timeout);
                    });
                    
                }
            });
            dispatch_resume(timer);
        }
    }
}

以上是关于iOS中如何实现准确的倒计时程序 · 九十里的主要内容,如果未能解决你的问题,请参考以下文章

第437道:百度程序员面试智力题,3分钟能给出答案——计时沙漏如何准确测出9分钟?

C++中如何精确计时

单元测试

实现高分辨率计时器的最佳方法

如何在javascript中创建一个准确的计时器?

使用计时器实现图片的准确缩放