IOS中的NSTimer定时器详解

时间:2024-03-09 15:25:20

/* 在IOS中有多种定时器,这里我对NSTimer定时器做了一个简单的介绍。如果你是小白,你可能会从这篇文章中学习到一些知识,如果你是大牛,请别吝啬你的评论,指出我的不足,你的质疑是对我最大的帮助。

 欢迎转载,转载时请注明出处:http://www.cnblogs.com/tanlong/p/5678569.html

*/

 

 

//这里直接在ViewController.m文件中写代码

@interface ViewController (){

    NSTimer *_myTimer;

}

 

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    

    

    /*

     interval: 此处设置为2.0,即表示2.0s后开始调用定时器,若下方repeats设置为YES,则每过2.0s都会执行一次,即循环执行

     target: 执行的对象  selector:关联的方法 userInfo:需要传递的参数(可以是单个也可以是多个,推荐使用字典)  repeats:是否重复执行,设置为NO,则只执行一次

     第一种创建方式,会自动把timer加入MainRunloop的NSDefaultRunLoopMode中。

     而第二种创建方式,必须手动把timer加入MainRunloop的NSDefaultRunLoopMode中

     */

    

    //第一种创建方式(可以不使用NSTimer进行接收,但如果这样做,就不能立即调用定时器),这里传了参数

    _myTimer = [NSTimer scheduledTimerWithTimeInterval: 2.0

                                     target: self

                                   selector: @selector(timeAction:)

                                   userInfo: @"我是定时器_myTimer"

                                    repeats: YES];

    //第二种创建方式,也可以不传参数

    NSTimer *timer = [NSTimer  timerWithTimeInterval:2.0 target:self selector:@selector(timerAct:) userInfo:nil repeats:YES];

    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

    

    //如果此处调用fire方法,则定时器立即运行一次,无需等待interval值设置的时间

    //[myTimer fire];

    [timer fire];

    NSLog(@"--1--");

    

    //这里创建3个按钮,关联三个方法,分别用来暂停,继续,撤销定时器_myTimer

    UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];

    button.frame = CGRectMake( 50, 200, 100, 60);

    [button setBackgroundColor: [UIColor grayColor]];

    [button setTitle:@"stop" forState:UIControlStateNormal];

    [button addTarget:self action:@selector(stop) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview: button];

    

    UIButton *button2 = [UIButton buttonWithType:UIButtonTypeSystem];

    button2.frame = CGRectMake( 50, 400, 100, 60);

    [button2 setBackgroundColor: [UIColor grayColor]];

    [button2 setTitle:@"continue" forState:UIControlStateNormal];

    [button2 addTarget:self action:@selector(continueAction) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview: button2];

    

    UIButton *button3 = [UIButton buttonWithType:UIButtonTypeSystem];

    button3.frame = CGRectMake( 50, 600, 100, 60);

    [button3 setBackgroundColor: [UIColor grayColor]];

    [button3 setTitle:@"invalidate" forState:UIControlStateNormal];

    [button3 addTarget:self action:@selector(invalidate) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview: button3];

}

 

 

/*

 以下是2个定时器关联的方法(推荐带NSTimer参数,这样可以在需要时撤销定时器)

 以及3各按钮关联的方法,分别做暂停,继续,撤销定时器操作

 

 例如:1.运行程序,控制台立即打印--3--,--1--,2s后再打印--2--我是定时器_myTimer, 之后每过2s打印一次--3--,--2--.

      2.点击暂停,定时器_myTimer暂停,控制台不再打印--2--我是定时器_myTimer。

      3.点击继续,控制台立即打印一次--2--我是定时器_myTimer,之后再循环打印。每点击一次继续,都会立即调用一次定时器,我是定时器_myTime,打印一次--2--我是定时器_myTimer。

      4.点击撤销,定时器_myTimer再不复存在了,之后再点击暂停继续都不会再做出响应。

 */

 

//定时器_myTimer关联的方法,这里打印传入的参数

- (void) timeAction:(NSTimer *) timer{

    NSLog(@"--2--%@",timer.userInfo);

}

 

//定时器_timer关联的方法

- (void) timerAct: (NSTimer *) timer{

    NSLog(@"--3--");

}

 

//暂停定时器(定时器还存在)

//例如设计一个游戏app,在程序进入后台时,可以暂停定时器,回到游戏时再继续定时器

- (void)stop {

    [_myTimer setFireDate:[NSDate distantFuture]];

}

 

//开启(继续)定时器

-(void)continueAction{

    //开启定时器

    [_myTimer setFireDate:[NSDate distantPast]];

}

 

//撤销定时器(定时器不存在了)

- (void)invalidate{

    [_myTimer invalidate];

    //撤销后,推荐再nil一次

    _myTimer = nil;

}

 

 

/* 以上代码可以直接复制粘贴到工程中运行,如果这篇文章对您有所帮助,请别吝啬你的赞哦*/