首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Objective-C:NSTimer和倒计时

Objective-C 中的 NSTimer 是一个定时器,可以用来执行周期性的任务。倒计时是一个常见的应用场景,可以使用 NSTimer 来实现。

以下是一个简单的倒计时示例代码:

代码语言:objective-c
复制
- (void)startTimerWithDuration:(NSTimeInterval)duration {
    NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:duration];
    self.timer = [NSTimer timerWithFireDate:fireDate interval:1.0 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}

- (void)timerFired:(NSTimer *)timer {
    NSTimeInterval remainingTime = [timer.fireDate timeIntervalSinceNow];
    if (remainingTime <= 0) {
        [self.timer invalidate];
        self.timer = nil;
        // 倒计时结束后的操作
    } else {
        // 更新倒计时显示
    }
}

在这个示例中,我们使用 timerWithFireDate:interval:target:selector:userInfo:repeats: 方法创建了一个 NSTimer 对象,并将其添加到当前运行循环中。startTimerWithDuration: 方法接受一个持续时间参数,该参数指定了倒计时的持续时间。timerFired: 方法在每次定时器触发时被调用,我们在这个方法中更新倒计时显示或者在倒计时结束后执行相应的操作。

需要注意的是,由于 NSTimer 的精度不高,因此在需要高精度的倒计时场景中,可以使用其他方法来实现,例如使用 GCD 的 dispatch_source_t 对象来实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Objective-C三种定时器CADisplayLink NSTimer GCD的使用

OC中的三种定时器:CADisplayLink、NSTimer、GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLink...-------------------我是分割线--------------------- 下面说说NSTImer, 一样我们直接看头文件并用注释说明 @interface NSTimer : NSObject...- (void)fire;  //立即执行一次定时器方法, 注意不是立即开启定时器 @property (copy) NSDate *fireDate;  //当前事件的触发事件, 一般用来做暂停恢复...我们知道NSTimer事件的触发事件是不准确的,完全取决于当前runloop处理的时间。...关于invalid方法 我们知道NSTimer使用的时候如果不注意的话,是会造成内存泄漏的。原因是我们生成实例的时候,会对控制器retain一下。

2.3K31
  • iOS定时器,你真的会使用吗?前言正文结语

    其原因可以查看我这篇《Objective-C RunLoop 详解》中的 “RunLoop 的 Mode“章节,有详细的介绍。...GCD定时器 ---- GCD定时器NSTimer是不一样的,NSTimer受RunLoop影响,但是GCD的定时器不受影响,因为通过源码可知RunLoop也是基于GCD的实现的,所以GCD定时器有非常高的精度...而 NSTimer 第一次执行是到计时器触发之后。这也是 NSTimer 之间的一个显著区别。...短信重发倒计时 短信倒计时使我们登录注册常用的功能,一般设置为60s,实现方法如下: // 计时时间 @property (nonatomic, assign) int timeout; /** 开启倒计时...创建方法同上面的短信倒计时. 这里我们使用NSTimer来创建一个每个5分钟执行一次的定时器.

    2.4K50

    系统框架--52:NSTimer会保留其目标对象

    NSTimer 计时器要和runloop相关联,runloop会触发任务。创建NSTimer时,可以将其“预先安排”在当前的runloop中,也可以创建好,然后再由开发人员自己调度。...self selector:@selector(run) userInfo:nil repeats:YES]; //停止timer [self.timer invalidate]; 注:targetselector...假如这是一个验证码倒计时程序,你可以在倒计时结束时调用end方法。但是你不能确定用户一定会等倒计时结束才返回到上一级页面.或许你想在dealloc方法中使定时器失效,那你就太天真了。...或许在倒计时程序中,你可以重写返回方法,先调用end再返回,但这不是一个好主意 这里采用block块的方法为NSTimer增加一个分类,具体细节看代码(程序员最好的语言是代码)。...iOS10中,定时器的API新增了block方法,实现原理这一样,只不过我这里用的是分类,而系统是在原始类中直接添加方法,最终的行为是一致的 #import "Student.h" @implementation

    12610

    IOS开发中滑动页面时NSTimer停止的问题

    我们在做倒计时的时候,发现当你手指按着屏幕不放,拖动tableView滑动的时候,写在cell上得倒计时停止倒计时,松开继续倒计时。研究发现就是拖动tableView滑动时,NSTimer停止了。...接着上面的话题,在开启一个NSTimer实质上是在当前的runloop中注册了一个新的事件源,而当scrollView滚动的时候,当前的 MainRunLoop是处于UITrackingRunLoopMode...当Runloop在A mode,而timer注册在B mode时就无法去检测这个timer,所以需要把NSTimer也注册到A mode,这样就可以被检测到。...一个简单例子,创建NSTimer进行倒计时时,修改model: - (id)initWithTimeout:(NSInteger)total { if (self = [self init])...scheduledTimerWithTimeInterval adds the timer to the current thread's run loop timer = [NSTimer

    1.8K90

    iOS开发中创建定时器

    blog.csdn.net/u010105969/article/details/79378106 应用场景: 1.轮播图(轮播图上的图片定时轮播) 2.跑秒按钮(点击获取验证码之后,按钮上的秒数进行倒计时...) 创建定时器的方式: 1.利用NSTimer 2.利用GCD中的dispatch_source_t 代码: 利用NSTimer创建定时器的代码: 方式一: (void)startTimer {...self.timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(updateTimer) userInfo:nil...方式二是开辟了一个子线程,在子线程的runloop中添加了NSTimer,此时即使模式是NSDefaultRunLoopMode,在用户与页面进行交互的时候,定时器依然有效。...利用GCD创建定时器: (void)go{ __block NSInteger time = 0; // 倒计时时间 dispatch_queue_t queue = dispatch_get_global_queue

    90420

    iOS开发:解决App进入后台,倒计时(定时器)不能正常计时的问题

    项目需求: 点击操作之后倒计时开始,然后App在后台运行,倒计时不停止继续执行。短信验证码 、时间倒计时等情况都适用这个需求。...常理: iOS程序进入后台运行,10分钟之内就会被系统“杀死”,所以倒计时会停止执行。 解决思路: 方法一:根据记录开始的时间获取当前时间进行时间差操作进行处理。...解决方法: 通过一个倒计时实例来展现一下运用,使用方法一来进行演示,方法二方法三不再本篇进行介绍,如有需要自行了解解决。...具体核心代码步骤如下所示: @property (nonatomic, strong) NSTimer *timer; @property (nonatomic, assign) int seconds...pragma mark --按钮点击事件-- - (void)brewBtnClick { if (_timer) { return; } // 给计时器赋值 _timer = [NSTimer

    6.7K84

    Objective-C中的继承多态

    面向对象编程之所以成为主流的编程思想和他的继承多态是分不开的,只要是面向对象语言都支持继承多态,当然不同的OOP语言之间都有其特点。...在Objective-C中super是指向直接父类的指针,而self是指向本身的指针,self就相当于java中的this指针。...= str1"); }     ​    ​Objective-C中的继承         继承是is-a的关系,比如猫咪是一个动物,那么动物是父类,而猫咪是动物的子类。...子类具有父类的属性 行为,以及自身的属性行为,也就是说“父类更一般,子类更具体”。用一个富二代的类来说明一下类的继承。  ...2014-07-30 08:38:12.958 HelloOC[483:303] 我是富二代BILL`s son,我超喜欢飙车 ​Objective-C中的多态     ​    ​多态简单的说就是对于不同对象响应同一个方法时做出的不同反应

    1.2K80

    RunLoop 总结:RunLoop的应用场景(二)让Timer正常运转

    这一篇就讲述一下RunLoop如何保证NSTimer在视图滑动时,依然能正常运转。 参考资料 好的书籍都是值得反复看的,那好的文章,好的资料也值得我们反复看。...2.界面上除了有tableView,还有显示倒计时的Label,当我们在滑动tableView时,倒计时就停止了,这又该怎么办呢? 场景中的代码实现 我们的定时器Timer是怎么写的呢?...可能会有两种写法,但是都有上面的问题,下面先看下Timer的两种写法: // 第一种写法 NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target...- (void)timerTest { // 第一种写法 NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self...forMode:NSRunLoopCommonModes]; [timer fire]; // 第二种写法,因为是固定添加到defaultMode中,就不要用了 } 从RunLoop官方文档

    67351

    【iOS开发】@objc private class func 与 Selector

    self.timer = NSTimer.scheduledTimerWithTimeInterval(timeInterval, target: self, selector: "moveText...NSNotificationCenter.defaultCenter().addObserver(self, selector: "appEnterForeground", name: nil, object: nil) 第一个是第一个定时器(NSTimer...private 关键字 最简单的使用 Selector 的情况,就是如上面所列出的,在 NSTimer 中写 selector 为 "moveText",然后我们在同一个文件中,再相应地写一个...【解决方案】 KVO 是基于 KVC 动态派发技术(Dynamic Dispatch)的,Swift 为了效率禁用了 Objective-C 中有的动态派发。...// Your Code } 则本文最开始的代码中的 target 应该由 self 换为 MyClass.self (假设这段代码写在名为 MyClass 的类中) self.timer = NSTimer.scheduledTimerWithTimeInterval

    87410

    编码篇-ARC下的内存泄漏

    所以,从本质上说ARCMRC在本质上是一样的,都是通过引用计数的内存管理方式。...CF类型内存 ARC 可以帮忙管理 Objective-C 对象, 但是不支持 Core Foundation 对象的管理,所以转换后要注意一个问题:谁来释放使用后的对象。...比如:CGColorCreateCGColorRelease 那Objective-C Core Foundation 对象相互转换时就可能出现内存泄漏的问题,可参考这篇文章处理。...** NSTimer的使用** NSTimerNSTimer会对它的target持有强引用,如果NSTimer不释放掉,就会一直持有它的target的强引用,如果这个NSTimer在被target强引用...下面的代码在书写的时候Xcode是不会报任何错误警告的。但是实际上已经形成了循环引用。造成了内存泄漏。

    1.7K20

    倒计时限时抢效果

    第一个是倒计时的天数效果。就是说假如现在是9月4号,我们设置结束时间为10月4号,那么显示的结果应该要为30。...首先写出当前时间和我们要结束的时间: 然后获取这两个时间的毫秒数之差,接着除以一天的毫秒数(24小时*60分*60秒*1000毫秒),就得出了天数了;之后将其显示在HTML元素上: 显示结果: 这样就完成了一个小的倒计时效果了...,贴出所有代码: --------------------------------------栗子分割线---------------------------------- 以上是一个相对简单的倒计时效果...,接下来我们要实现一个限时抢的效果,效果如图: 思路类似倒计时效果;先知道要结束的时间,再获取当前时间,得出时间差,时间差则通过数学换算成天、小时、分、秒即可。...老规矩,先写HTML,用了一个ID为leftTime的元素来显示效果: 接着在html都载入时执行js,我们把动画都封装在一个showTime()函数中: 接着进入正题啦;先获取当前时间结束时间(

    1.6K20

    iOS 短信验证码倒计时按钮的实现

    实现思路 创建按钮, 添加点击方法; 用NSTimer定时器, 每秒执行一次, 定时改变Button的title,改变Button的样式, 设置Button不可点击; 若倒计时结束, 定时器关闭, 并改变...在app开发中经常会遇到,输入手机号获取验证码的功能,下面就和大家分享一下,获取验证码倒计时的功能实现 首先给大家看一下页面展示 ?...forState:0]; [self.contentView addSubview:_againBtn]; 按钮点击事件 - (void)againBtn:(UIButton *)sender{ //倒计时函数...[self messageTime]; } 倒计时函数 - (void)messageTime { __block int timeout=60; //倒计时时间 dispatch_queue_t...NSEC_PER_SEC, 0); //每秒执行 dispatch_source_set_event_handler(_timer, ^{ if(timeout<=0){ //倒计时结束

    2.1K10
    领券