您的位置:首页 > 其它

NSTimer用法,暂停,继续,初始化

2014-07-28 23:03 309 查看
NSTimer的使用方法

1、初始化

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;

注:不用scheduled方式初始化的,需要手动addTimer:forMode: 将timer添加到一个runloop中。

  而scheduled的初始化方法将以默认mode直接添加到当前的runloop中.

scheduledTimerWithTimeInterval:(NSTimeInterval)seconds

预订一个Timer,设置一个时间间隔。

表示输入一个时间间隔对象,以秒为单位,一个>0的浮点类型的值,如果该值<0,系统会默认为0.1

target:(id)aTarget

表示发送的对象,如self

selector:(SEL)aSelector

方法选择器,在时间间隔内,选择调用一个实例方法

userInfo:(id)userInfo

此参数可以为nil,当定时器失效时,由你指定的对象保留和释放该定时器。

repeats:(BOOL)yesOrNo

当YES时,定时器会不断循环直至失效或被释放,当NO时,定时器会循环发送一次就失效。

举例:

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(timerFired:) userInfo:nil repeats:NO];


// 使用timerWithTimeInterval方法来实例化一个NSTimer,这时候NSTimer是不会启动的

NSTimer *myTimer = [NSTimertimerWithTimeInterval:3.0 target:selfselector:@selector(timerFired:)userInfo:nilrepeats:NO];
// 当需要调用时,可以把计时器添加到事件处理循环中

[[NSRunLoopcurrentRunLoop]addTimer:myTimerforMode:NSDefaultRunLoopMode];

NSRunLoop是什么?

循环运行!就像是程序的中枢神经,一直在运转着,并且监视着程序各种的事件、线程等等。

一旦出现了相关的事件,那么就开始调度,分配适当的对象来执行适当的操作!

scheduledTimerWithTimeInterval创建的全部都是主线程在执行,那样的话,就有点问题了,我们应该让它在其他线程来执行!你懂的!

现在做个比喻:

我们可以把调度一个计时器与启动汽车的引擎相比较。已经调度的计时器就是运行中的引 擎。没有被调度的计时器就是一个已经准备好启动但是还没有运行的引擎。我们在程序里
面,无论何时,都可以调度和取消调度计时器,就像根据我们所处的环境,决定汽车的引擎 室启动还是停止。如果你想要在程序中,手动的在某一个确定时间点调度计时器,可以使用 NSTimer 的类方法timerWithTimeInterval:target:selector:userInfo:repeats:
方法。


飘红部分!说的好经典!
以上的程序,确实,我们能够调用和停止定时器,但是,我们还不够“随心所欲”。因为NSTimer在初始化后就马上开始执行了!!!

重点:

2、触发(启动)

当定时器创建完(不用scheduled的,添加到runloop中后,该定时器将在初始化时指定的timeInterval秒后自动触发。

3、停止

- (void)invalidate;

这个是唯一一个可以将计时器从runloop中移出的方法。



注:

NSTimer可以精确到50-100毫秒.

NSTimer不是绝对准确的,而且中间耗时或阻塞错过下一个点,那么下一个点就pass过去了.

为NSTimer添加一个分类

#import "TFTimer.h"
#import <Foundation/Foundation.h>
@interface NSTimer (TFAddition)

-(void)pauseTimer;
-(void)resumeTimer;

@end

#import "TFTimer.h"
@implementation NSTimer (TFAddition)

-(void)pauseTimer{

if (![self isValid]) {
return ;
}

[self setFireDate:[NSDate distantFuture]]; //如果给我一个期限,我希望是4001-01-01 00:00:00 +0000

}

-(void)resumeTimer{

if (![self isValid]) {
return ;
}

//[self setFireDate:[NSDate dateWithTimeIntervalSinceNow:0]];
[self setFireDate:[NSDate date]];

}

@end


NSTimer的初始化方法<三>

我们也可以用timerWithTimeInterval方式来创建一个NSTimer

贴:

- (void) startPainting{

// 定义将调用的方法

SEL selectorToCall = @selector(paint:);

// 为SEL进行 方法签名

NSMethodSignature *methodSignature =[[self class]
instanceMethodSignatureForSelector:selectorToCall];

// 初始化NSInvocation

NSInvocation *invocation =[NSInvocation invocationWithMethodSignature:methodSignature];

[invocation setTarget:self];

[invocation setSelector:selectorToCall];

self.paintingTimer = [NSTimer timerWithTimeInterval:1.0

invocation:invocation

repeats:YES];



// 当需要调用时,可以把计时器添加到事件处理循环中

[[NSRunLoop currentRunLoop]
addTimer:self.paintingTimerforMode:NSDefaultRunLoopMode];

}

忽然想问一句:NSInvocation是什么?

是Object-C 中的消息传递着。它可以以“方法签名”的方式来封装一个对象的方法,并且在各个对象中传送!主要可以用在NSTimer中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: