*说明:翻译水平有限,希望对初学者有帮助。本人添加的部分用下划线标明。重点用橙色字体。
类 NSTimer 说明
一、概述
你可以用NSTimer类来创建定时器对象。经过一定时间启动定时器,并发送一个特定消息给目标对象。比如:你创建了一个定时器,用于一段时间之后,给窗口发了一条消息,告诉它更新。
定时器跟run loops协同工作。想要高效使用NSTimer,你应该了解run loops是怎么操作的。需要特别说明的是:run loops 持有(retain)定时器。所以,你可以在定时器加入run loop后,释放它。
定时器不是真正意义上,实时生效的机制;仅当run loop(自己已经添加进去了)正在运行,且程序设定的启动时间已经过去了,定时器才会启动。由于run loop管理着各种的输入源,所以NSTimer的精准度在50-100微秒。如果定时器启动时刻正一个很长时间的callout或者run loop处于一个不再检测这个定时的模式,它将不启动直到run loop检测到下一个启动时刻。因此,定时器真正生效时间,应该在程序设定启动时刻之后的一段时间内。
NSTimer 是“tool-free bridge”模式,在Core Foundation中对应着CFRunLoopTimerRef。
重复 vs 非重复定时器
在初始化定时间的时候,你要指定这个定时器是重复的还是非重复的。顾名思义:非重复的定时器启动一次后,自动失效,从而防止再次触发定时器。与此相反,重复定时器启动一次后,又把自己放到run loop里,准备下次启动。
重复模式的定时器总是根据,被设计好的时间来安排自己启动时间,并非实际启动时间。如果,一个定时器的启动时间是每5秒。那么定时器就在5秒后启动,即便实际的时间被延时了。如果,启动时间呗延时的足够长,达到多个启动时间(10秒,20秒等),这段时间内定时器将只启动一次;定时器被重新排布时间,等待下次启动时刻到来。
在Run Loops里安置定时器
scheduledTimerWithTimeInterval:invocation:repeats:
或者scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:来创建定时器,默认被安置到当前的run loop上。
timerWithTimeInterval:invocation:repeats:
或者 timerWithTimeInterval:target:selector:userInfo:repeats:
来创建定时器,不会安置到run loop里(创建后,你必须手动安置到一个run loop里,通过调用NSRunLoop的函数 addTimer:forMode:
)。
initWithFireDate:interval:target:selector:userInfo:repeats:方法。(同样,你必须手动安置到一个run loop里通过调用NSRunLoop的函数 addTimer:forMode:
)
一旦定时器被安置到run loop里,定时器就开运行了,直到自己失效。非重复定时器运行后,就让自己失效。然而,对于重复模式定时器,你需要调用invalidate函数使定时器失效。调用invalidate使得定时器从当前的run loop移除。结果,你应该总是调用 invalidate
方法,来移除安装在同一个线程上的定时器。失效的定时器会立即被禁用,以便它不再影响run loop,run loop在invalidate
方法返回前或者稍晚一些,移除并释放定时器,定时器一旦失效,这个对象将不能再使用了。
NSTimer子类注意事项
你不应该尝试用NSTimer生成子类。
Tasks
[timersetFireDate:[NSDatedistantFuture]];
恢复定时器[timersetFireDate:[NSDatedate]];
[iNorSlidePer fire];
其他信息
类方法
-------------------------------------------------------------------
scheduledTimerWithTimeInterval:invocation:repeats:
创建一个NSTimer对象,默认并把它安置到当前的run loop里。+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds invocation:(NSInvocation *)invocation repeats:(BOOL)repeats
参数:
seconds:
定时器间隔,如果seconds <= 0.0,该函数选择0.1毫秒代替。
invocation:
The invocation to use when the timer fires. The timer instructs the invocation object to retain its arguments.
repeats:
如果YES,定时器重复启动自己直到失效。如果NO,定时器启动后即失效。
讨论:
经过seconds秒后,定时器启动,回调invocation。
scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
创建一个NSTimer对象,默认并把它安置到当前的run loop里。timerWithTimeInterval:invocation:repeats:
创建一个用invocation对象初始化的NSTimer对象,timerWithTimeInterval:target:selector:userInfo:repeats:
创建一个用特定对象初始化的NSTimer对象。- (void)timerFireMethod:(NSTimer*)theTimer
定时器把自己当做参数传递给这个函数。
方法实例
initWithFireDate:interval:target:selector:userInfo:repeats:
用target和select初始化定时器。- (void)timerFireMethod:(NSTimer*)theTimer
定时器把自己当做参数传递给这个函数。
invalidate
invalidate
方法返回前或者稍晚一些,移除并释放定时器。
特别注意事项:
你必须在定时器所在的线程中发送这个消息。如果从其他可能退出的线程中发送这个消息,定时器相关的输入源可能会从run loop中移除。