如何让NSTimer保持活力?

时间:2012-03-20 13:36:44

标签: iphone objective-c ios xcode4 nstimer

我的应用程序中有2个viewControllers,从第一个视图导航到下一个时,有一个名为startTimer的按钮,其中有一个计时器操作作为选择器方法点击startTimer,计时器在 HH:mm:ss中启动格式,我不是使计时器无效,但当我回到第一个viewController并再次如果我再次来到第二个viewController并且如果我按下startTimer按钮,计时器再次从0开始,但我希望它保留以前的价值,我怎么能实现这个目标?我知道,因为我再次加载viewController,nib将被新加载到内存中,但我如何保留计时器标签和计时器值? 任何帮助都会提前感谢。谢谢。

4 个答案:

答案 0 :(得分:3)

通过将数据放入视图控制器,您已经破坏了MVC(模型 - 视图 - 控制器)。此外,你要求的机制没有时间(NSTimer)的坚定承诺来跟踪你的时间。 NSTimer不会在您请求的时间间隔内完全 。它可以在该间隔之后的任意点发射。 使用NSTimer作为秒表几乎总会浪费时间(有时会花很多时间,特别是如果周围有滚动视图)。(最后一点被夸大了。重复计时器正确安排自己所以通常不会浪费时间。如果重复被完全跳过,你就会失去时间,这可能发生在长卷轴或其他可以让计时器停止射击一整秒的事情中。)

创建一个新的模型对象来保存秒表信息。我们称之为Stopwatch。假设您需要它是可开始且可停止的,它需要NSTimeInterval accumulatedTime属性和NSDate lastStarted属性(如果您愿意,还可以使lastStarted成为NSTimeInterval)。因此,要启动秒表,请将lastStarted设置为“现在”。要停止秒表,请清除lastStarted并将当前累计时间移至accumulatedTime。要查找当前时间,请将accumulatedTime添加到now - lastStarted

好的,既然你拥有它,你能用它做什么?您可以将它传递给视图控制器,他们可以询问“当前的秒表值是多少?”他们可以随心所欲地开始和停止它。

现在你的视图控制器想要每秒更新它的显示,所以你有一个计时器来做到这一点。每秒它都会向秒表询问“当前时间是多少”并显示出来。但它没有设置时间。它只是问。

顺便说一下,您也可以在Stopwatch上使用KVO,但这有点棘手,因为Stopwatch需要运行自己的计时器来发送更改通知。我一般认为这比它的价值更麻烦。

答案 1 :(得分:0)

不要这样做,这样每次加载包含NSTimer的视图时,都会创建一个新的NSTimer对象,而旧的NSTimer对象仍然在内存中,因为你没有使它失效。

最好的方法是必须将NSTimer放在Application Delegate中,然后仅在第一次加载View Controller时启动它。

为实现此目的,您必须设置一个标志以检查View是否第一次加载。

答案 2 :(得分:0)

如果NSTimer是您的实例变量之一,我猜您可以检查它是否已分配。


//NSTimer *timer;  declare this in your interface

if (timer==nil)
{
   // allocate timer
}
//Do nothing if it is allocated all ready

答案 3 :(得分:0)

我要做的是将第二个视图控制器保存为第一个视图控制器的ivar。这样,您只需将其实例化一次,NSTimer就会保留在内存中。

但是,如果要保持自己的风格,则应将当前时间保存在任何类型的首选项中(查看[NSUserDefaults standardUserDefaults]或创建自己的单例类)。然后在视图中从第二个视图控制器执行加载方法,加载该值并将其添加为计时器的偏移量。

希望能帮到你!