NSTimer定时器的使用

前言:这是关于NSTimer的学习笔记。

 

正文内容大纲:

1、关于计时器NSTimer的一个被添加进NSRunLoop的使用细节

2、关于NSTimer常用方法的使用

3、关于NSTimer的类别工具类

 

正文:

1、关于计时器NSTimer的一个被添加进NSRunLoop的使用细节

下面展示一个示例:

NSTimer scheduledTimerWithTimeInterval方法中,底层是会执行第11、12行代码的,只是和上面代码不一样的是,forMode的参数是NSDefaultRunLoopMode

理解:RunLoop肯定是管理着主UI界面上很多线程的,比如用户点击交互时间、刷新UI等操作,其实很多操作避免阻塞一般是会在不同的线程中执行,执行的过程中,会在多条线程之间切换执行。

而自己通过NSTimer创建的定时器任务,底层默认添加到NSRunLoop中的mode是默认的方式,而默认是什么意思呢?就是如果当前UI主界面有很多其他操作的话,就会把这个定时器任务放在一边,等其他操作完了之后,才会执行定时器的任务。但是如果自己将计时器任务添加到NSRunLoop中,并把Mode设置为NSRunLoopCommonModes,就不会出现定时器任务被放在一边等待执行的情况了。

处于性能的考虑:当然是NSDefaultRunLoopMode默认的比较好。这个可以根据自己实际需求而考虑。

2、关于NSTimer常用方法的使用:

调用一次计时器方法:

1 myTimer = [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(scrollTimer) userInfo:nil repeats:NO];
2 //不重复,只调用一次。timer运行一次就会自动停止运行

重复调用计时器方法:

1 timer =  [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(function:) userInfo:nil repeats:YES];
2 //每1秒运行一次function方法。

 

注意:将计数器的repeats设置为YES的时候,self的引用计数会加1。因此可能会导致self(即viewController)不能release,所以,必须在viewWillAppear的时候,将计数器timer停止,否则可能会导致内存泄露。

停止timer的运行,但这个是永久的停止:

1 //取消定时器
2 [timer invalidate];

 要想实现:先停止,然后再某种情况下再次开启运行timer,可以使用下面的方法:

首先关闭定时器不能使用上面的方法,应该使用下面的方法:

1 //关闭定时器
2 [myTimer setFireDate:[NSDate distantFuture]];

然后就可以使用下面的方法再此开启这个timer了:

1 //开启定时器
2 [myTimer setFireDate:[NSDate distantPast]];

例子:比如,在页面消失的时候关闭定时器,然后等页面再次打开的时候,又开启定时器。

(主要是为了防止它在后台运行,暂用CPU)可以使用下面的代码实现:

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

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

OK,搞定。

 

3、关于NSTimer的类别工具类

NSTimer+Addition.h

#import <Foundation/Foundation.h>

@interface NSTimer (Addition)

- (void)pauseTimer;
- (void)resumeTimer;
- (void)resumeTimerAfterTimeInterval:(NSTimeInterval)interval;
@end

NSTimer+Addition.m

#import "NSTimer+Addition.h"

@implementation NSTimer (Addition)

-(void)pauseTimer
{
    if (![self isValid]) {
        return ;
    }
    [self setFireDate:[NSDate distantFuture]];
}

-(void)resumeTimer
{
    if (![self isValid]) {
        return ;
    }
    [self setFireDate:[NSDate date]];
}

- (void)resumeTimerAfterTimeInterval:(NSTimeInterval)interval
{
    if (![self isValid]) {
        return ;
    }
    [self setFireDate:[NSDate dateWithTimeIntervalSinceNow:interval]];
}

@end
时间: 2025-01-03 17:31:12

NSTimer定时器的使用的相关文章

iOS中的NSTimer定时器的初步使用解析_IOS

创建一个定时器(NSTimer) - (void)viewDidLoad { [super viewDidLoad]; [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(actionTimer:) userInfo:nil repeats:YES]; } - (void)actionTimer:(NSTimer *)timer { } NSTimer默认运行在default mode下,default

iOS - OC NSTimer 定时器

前言 @interface NSTimer : NSObject @interface CADisplayLink : NSObject 作用 在指定的时间执行指定的任务. 每隔一段时间执行指定的任务. 1.定时器的创建 1.1 NSTimer 定时器 当定时器创建完(不用 scheduled 的,添加到 runloop 中)后,该定时器将在初始化时指定的 ti 秒后自动触发.如果 NSTimer 的触发时间到的时候,runloop 在阻塞状态,触发时间就会推迟到下一个 runloop 周期.

iOS - Swift NSTimer 定时器

前言 public class NSTimer : NSObject 作用 在指定的时间执行指定的任务. 每隔一段时间执行指定的任务. 1.定时器的创建 当定时器创建完(不用 scheduled 的,添加到 runloop 中)后,该定时器将在初始化时指定的 ti 秒后自动触发. scheduled 方式: 创建并启动定时器. 默认将时钟以 NSDefaultRunLoopMode 模式添加到运行循环. 发生用户交互的时候,时钟会被暂停. /* public class func schedul

IOS NSTimer 定时器用法总结

NSTimer在IOS开发中会经常用到,尤其是小型游戏,然而对于初学者时常会注意不到其中的内存释放问题,将其基本用法总结如下: 一.初始化方法:有五种初始化方法,分别是 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo; ? 1 2 3 4 5 6 7 8 9 10 11 12 - (void)viewDidLoad {

IOS object-c 中定时器NSTimer的开启与关闭

调用一次计时器方法:  代码如下 复制代码 myTimer = [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(scrollTimer) userInfo:nil repeats:NO];  //不重复,只调用一次.timer运行一次就会自动停止运行  重复调用计时器方法:  代码如下 复制代码 timer =  [NSTimer scheduledTimerWithTimeInterval:1

IOS开发--常用工具类收集整理(Objective-C)(持续更新)

 前言:整理和收集了IOS项目开发常用的工具类,最后也给出了源码下载链接. 这些可复用的工具,一定会给你实际项目开发工作锦上添花,会给你带来大大的工作效率. 重复造轮子的事情,除却自我多练习编码之外,就不要傻傻的重复造轮子了,还是提高工作效率,早点完成工作早点回家陪老婆孩子. 所以下面备份的常用工具类一定是你需要的. 前提:你有一定的开发经验,知道它们在开发的什么地方需要,你都不知道用在哪里,那你需要个毛啊,还是好好另外学好基础吧.少儿不宜,请离开哦. 插件目录列表:(持续更新和添加) 1.UI

iOS开发UI篇—UIScrollView控件实现图片轮播

一.实现效果 实现图片的自动轮播 二.实现代码 storyboard中布局 代码: 1 #import "YYViewController.h" 2 3 @interface YYViewController () <UIScrollViewDelegate> 4 @property (weak, nonatomic) IBOutlet UIScrollView *scrollview; 5 /** 6 * 页码 7 */ 8 @property (weak, nonato

IOS开发之多线程 -- GCD的方方面面

前言:这篇GCD的博文是本人阅读了很多海内外大神的关于GCD的文章,以及结合之前自己对GCD的粗浅的认识,然后取其精华,去其槽粕,综合起来的笔记,而且是尽可能的以通熟易懂的并且是正确的理论论述方式呈现给读者,同时也是讲大神博客中有的深涩的理论理解的通熟易懂转述给读者,已经是尽可能的让读者深入理解和掌握多线程的知识以及GCD的使用技术.最后的附录中,我将会给出所有本人阅读的大神写的关于多线程或者是GCD的文章链接,大家感兴趣的,可以去参考和学习.也许,看我的这篇就够了,因为我就是参考他们的,嘻嘻.

iOS开发中使用UIScrollView实现图片轮播和点击加载_IOS

UIScrollView控件实现图片轮播 一.实现效果 实现图片的自动轮播 二.实现代码 storyboard中布局 代码: 复制代码 代码如下: #import "YYViewController.h" @interface YYViewController () <UIScrollViewDelegate> @property (weak, nonatomic) IBOutlet UIScrollView *scrollview; /**  *  页码  */ @pro