关于NSTimer,apple的官方文档翻译如下:(本人能力有限,只能翻个大概,各位勿喷)
NSTimer被用来创建定时器对象。它在被设置启动时间并启动后,会发送一条指定的消息给目标对象。比如,你可以创建一个定时器对象,用来告诉窗口让它在某个给定的时间进行更新。
定时器总是结合run loops 一起使用的。想要有效的使用它,必须对NSRunLoop和Threading Programming Guide的过程有大概的了解。需要特别注意的是:run loops对添加到它身上的定时器保持了强引用,所以在使用时你并不需要自己保持强引用。
定时器并不是实时启动的,只有在添加了它的那个run loop正在运行,并能够检查它的启动时间是否已经过时,定时器才能被启动。定时器的时间间隔最好设置在50-100毫秒,因为很多输入流都是典型的run loop管理,这样才最有效。如果定时器的启动时间放生在一段很长的召唤时间内,或者当run loop正好处在一种不能监听定时器的状态,定时器将不会被启动,直至下一次run loop检查定时器。因此,定时器的实际启动时间可能在安排的启动时间以后,而且比较明显。这点后面我们还会提到。
可重复和非可重复的定时器在创建定时器的时候,需要指定它是可重复或者是非可重复的。一个非可重复的计时器只会启动一次,启动完后它自身会自动失效,这可以防止它重复启动。相反,可重复的定时器在启动后会自己在同一run loop中安排下一次启动时间。可重复定时器根据那个与实际启动时间有出入的时间(我们指定的)来安排自己的启动时间。例如:如果一个定时器被安排在某个特定的时间启动,然后每隔5秒启动一次。那么不管实际启动时间延迟了多久,被安排的启动时间将落在原来安排的5秒之内。如果启动时间延长了很久,久到跳过一个甚至很多个被安排的启动时间,那么计时器将只会在这段时间内启动一次,随后定时器将在启动后重新安排下一次的启动时间。
时间偏差在iOS 7 和OS X v10.9以后,我们可以为定时器指定一个偏差(tolerance)。这可以在使用定时器的时候增加系统优化电池续航能力,提高响应能力的灵活性。定时器将会在(被安排的启动时间)至(被安排的启动时间加上偏差)的这个时间段内任意时间点开启。在早于被安排启动的时间,定时器是不会开启的。对于可重复的计时器,下一次的启动时间将按照原定的启动时间进行计算,忽略个别的偏差,以免造成偏移。(要知道,多次累计的偏差相加会造成偏差越来越大)。偏差默认值时0。系统保持了对某些定时器忽略偏差属性使用小量偏差的权利。作为定时器的使用者,你将会对一个定时器的大概偏差时多少有个最好的主意。大体规则是,为可重复的定时器设置一个至少10%时间间隔的偏差。就算一个非常小的偏差,对减少应用的耗电量都有一个非常显著的影响。系统一般会采取偏差的最大值。
在run loop中设置定时器
尽管定时器可以以多种模式(run loop modes)添加到run loop中,但是一个定时器一次只能在一个run loop中注册。一下是三种创建定时器的方式:
或者 scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:类方法创建定时器,它将以默认模式被设置当前run loop中。
2. 使用timerWithTimeInterval:invocation:repeats:或者timerWithTimeInterval:target:selector:userInfo:repeats:类方法创建定时器,此时它并没有被设置到run loop中。(创建后,必须调用NSRunLoop的addTimer:forMode:方法,手动将定时器加到run loop的)
3. 使用initWithFireDate:interval:target:selector:userInfo:repeats:分配后初始化一个定时器。(创建后,必须调用NSRunLoop的addTimer:forMode:方法,手动将定时器加到run loop的)
一旦被添加到run loop中,定时器将会在某个特定的时间被启动,直到失效。一个非可重复的定时器会在启动后立刻自动失效。然而,对于可重复定时器,你必须使用它们的invalidate方法来让它失效。你必须得在添加了定时器的同一线程中调用这个方法要求从单线的run loop中移除定时器。让定时器失效会立即执行,这样避免它再次影响run loop。而定时器从run loop中移除(包括对定时器的强引用),则会在invalidate方法返回结果之前或者之后的某个时间点执行。一旦执行,计时器不能再被使用。
欢迎大家指导纠正:)如需装贴,请附上本链接。
NSTimer
最新推荐文章于 2024-08-25 21:56:58 发布