iOS NSTimer定时器详解

iOS NSTimer定时器详解及注意事项

1. 接口

@interface NSTimer : NSObject

// 该方式默认会将定时器添加到NSRunLoop中
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;  

// 该方式必须手动加入到当前循环中去,必须显式加入:[[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode];	
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;	

// 创建一个定时器如果不手动触发定时器,那么定时器会过TimeInterval秒后自动执行selector
// 如果想立刻执行直接调用fire方法													
// 在重复执行的定时器中调用此方法后立即触发该定时器,但不会中断其之前的执行计划;
// 在不重复执行的定时器中调用此方法,立即触发后,就会使这个定时器失效。
- (void)fire;				
- (void)invalidate;			// 停止定时器(永久停止)不是暂停定时器, 这个是唯一一个可以将计时器从runloop中移出的方法

@property (copy) NSDate *fireDate;	//重新设置定时器开始运行的时间
@property(readonly, getter=isValid) BOOL valid;  // 定时器是否正在运行中

@end


2.注意事项

1、初始化

//方式1:创建一个定时,该方式默认会将定时器添加到NSRunLoop
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(action:) userInfo:nil repeats:YES];


//方式2: 该方式必须显式手动加入到当前循环中去
NSTimer *timer = [NSTimer timerWithTimeInterval:10 target:self selector:@selector(action:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode];

2、注意事项

NSTimer可以精确到50-100毫秒.
NSTimer不是绝对准确的,而且中间耗时或阻塞错过下一个点,那么下一个点就pass过去了.

[NSDate distantFuture];(不可达到的未来的某个时间点)
[NSDate distantPast];  (不可达到的过去的某个时间点)

NSTimer可以精确到50-100毫秒.
NSTimer不是绝对准确的,而且中间耗时或阻塞错过下一个点,那么下一个点就pass过去了.

[NSDate distantFuture];(不可达到的未来的某个时间点)
[NSDate distantPast];  (不可达到的过去的某个时间点)

// 永久停止定时器,一但停止将永久停止而不是暂停
[timer invalidate];
timer = nil;

3、立刻启动  暂停  继续 停止

[timer fire]; // 立刻启动
[timer invalidate]; // 停止
[timer setFireDate:[NSDate distantFuture]]; // 暂停
[timer setFireDate:[NSDate distantPast]]; // 继续

3. 示例Demo

#import <UIKit/UIKit.h>

@interface MainViewController : UIViewController {
    int i;
    NSTimer * timer;
}


@property (weak, nonatomic) IBOutlet UILabel *label;

// 立即开始
- (IBAction)startOnClicked:(UIButton *)sender;

// 永久停止
- (IBAction)stopOnClicked:(UIButton *)sender;

// 暂停
- (IBAction)pauseOnClicked:(UIButton *)sender;

// 继续
- (IBAction)resumeOnClicked:(UIButton *)sender;

@end
#import "MainViewController.h"

@interface MainViewController ()

@end

@implementation MainViewController

#pragma mark -
#pragma mark - View LifeCycle
- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = @"NSTimer Demo";
    
    i = 0;
    timer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
}

//页面将要进入前台,开启定时器
-(void)viewWillAppear:(BOOL)animated {
    [timer setFireDate:[NSDate distantPast]];       //开启定时器
}

//页面消失,进入后台不显示该页面,关闭定时器
-(void)viewDidDisappear:(BOOL)animated {
[timer setFireDate:[NSDate distantFuture]];     //关闭定时器
}


#pragma mark - Actions
- (void)timerAction:(NSTimer *)timer {
    i += 1;
    self.label.text = [NSString stringWithFormat:@"%d", i];
    
    NSLog(@"run : %d", i);
}


- (IBAction)startOnClicked:(UIButton *)sender {
    NSLog(@"right now start ---------------");
    [timer fire];
}

- (IBAction)stopOnClicked:(UIButton *)sender {
    NSLog(@"game over ~~~~~~~~~~~~~~~~~~~~");
    [timer invalidate];
}

- (IBAction)pauseOnClicked:(UIButton *)sender {
    NSLog(@"XXXXXXXX pause XXXXXXXX");
    [timer setFireDate:[NSDate distantFuture]];
    
}

- (IBAction)resumeOnClicked:(UIButton *)sender {
    NSLog(@"resume...");
    [timer setFireDate:[NSDate distantPast]];
}
@end

效果如图:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风流 少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值