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);
        }
    }
}

Related Posts

原文地址:https://www.cnblogs.com/lijianming180/p/12037882.html

时间: 2024-10-07 09:58:38

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

IOS中UIWebView和JavaScript交互(转自http://blog.2jun.net/2012/11/02/webviewandjs/)

IOS中UIWebView和JavaScript交互 当程序中使用到UIWebView控件的时候,难免会遇到需要与页面进行交互的情况.这种情况在android平台下比较容易处理,android平台下WebView控件的addJavascriptInterface()方法可以很轻松的完成交互,而IOS上就稍复杂一些. 页面与客户端的交互是通过JS来完成的,通常情况下与JS的交互可以分为两种:客户端传递给JS一些数据和JS向客户端请求一些本地操作.下面分别对这两种情况进行处理. JS向客户端请求本地

iOS之与iTunes文件共享,在程序中获得Document路径

有时候程序开发需要通过沙盒中的 documents文件夹与用户共享文件,iTunes默认是不支持iTunes file Sharing的,首先设置 info-list的Application supports iTunes file sharing为YES. 这样程序就可以支持文件共享. 然后我将iPad破解后,用91助手往里面存了点东西,作为测试使用,访问Document路径的代码如下: NSString *homeDir = NSHomeDirectory(); NSArray *paths

IOS中公布应用程序,进度条一直不走怎么处理

在IOS中公布应用程序非常是喜闻乐见. 近期1周.我更新了6次版本号.可是时不时的会卡住,进度条不走. 最后总结了几个原因. 1.在公布前你要确认自己的证书是否配置正确 2.DNS域名server有没有配置. 8.8.8.8 和 8.8.4.4 或者114.114.114.114 (这3个域名地址来回的尝试.本人在这3个域名下都成功的公布过)附图 3.直接archive.可是要先验证下.这样假设证书或者这书配置文件有问题能够直接改动.

iOS 中捕获程序崩溃日志

iOS开发中遇到程序崩溃是很正常的事情,如何在程序崩溃时捕获到异常信息并通知开发者,是大多数软件都选择的方法.下面就介绍如何在iOS中实现: 1. 在程序启动时加上一个异常捕获监听,用来处理程序崩溃时的回调动作  NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler);  官方文档介绍:Sets the top-level error-handling function where you can perform last-minute

iOS中消息的传递机制(KVO、Notification、delegation、block以及target-action)---转载

注1:本文由破船[博客]译自Communication Patterns. 本文目录如下所示: 可用的机制 做出正确的选择 Framework示例 小结 每个应用程序或多或少,都由一些松耦合的对象构成,这些对象彼此之间要想很好的完成任务,就需要进行消息传递.本文将介绍所有可用的消息传递机制,并通过示例来介绍这些机制在苹果的Framework中如何使用,同时,还介绍了一些最佳实践建议,告诉你什么时机该选择使用什么机制. 虽然这一期的主题是关于Foundation Framework的,不过本文中还

iOS中崩溃调试的使用和技巧总结 韩俊强的博客

每日更新关注:http://weibo.com/hanjunqiang  新浪微博 在iOS开发调试过程中以及上线之后.程序经常会出现崩溃的问题.简单的崩溃还好说,复杂的崩溃就须要我们通过解析Crash文件来分析了,解析Crash文件在iOS开发中是比較常见的. 如今网上有非常多关于解析崩溃信息的博客.可是大多质量參差不齐,或者有些细节没有注意到.今天写一篇博客总结一下我对崩溃调试的使用和技巧,假设有哪些错误或遗漏.还请指点.谢谢. 获取崩溃信息 在iOS中获取崩溃信息的方式有非常多,比較常见的

iOS中的MVC

我们今天谈谈cocoa程序设计中的 模型-视图-控制器(MVC)范型.我们将从两大方面来讨论MVC: 什么是MVC? M.V.C之间的交流方式是什么样子的? 理解了MVC的概念,对cocoa程序开发是至关重要的. 一.MVC的概念 MVC是Model-VIew-Controller,就是模型-视图-控制器,这些都是什么东西呢? MVC把软件系统分为三个部分:Model,View,Controller.在cocoa中,你的程序中的每一个object(对象)都将明显地仅属于这三部分中的一个,而完全不

iOS中消息的传递机制

小结 每个应用程序或多或少,都由一些松耦合的对象构成,这些对象彼此之间要想很好的完成任务,就需要进行消息传递.本文将介绍所有可用的消息传递机制,并通过示例来介绍这些机制在苹果的Framework中如何使用,同时,还介绍了一些最佳实践建议,告诉你什么时机该选择使用什么机制. 虽然这一期的主题是关于Foundation Framework的,不过本文中还介绍了一些超出Foundation Framework(KVO和Notification)范围的一些消息传递机制,另外还介绍了delegation,

IOS中调用系统的电话、短信、邮件、浏览功能

iOS开发系列--通讯录.蓝牙.内购.GameCenter.iCloud.Passbook系统服务开发汇总 2015-01-13 09:16 by KenshinCui, 26990 阅读, 35 评论, 收藏, 编辑 --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: 调用系统应用 使用系统服务目 录 短信与邮件 通讯录