繁体   English   中英

如何保持NSTimer的生命?

[英]How to keep NSTimer alive?

我的应用程序中有2个viewControllers,从第一个视图开始,当我导航到下一个视图时,有一个名为startTimer的按钮,带有计时器动作,作为单击startTimer时的选择器方法,计时器以HH:mm:ss格式启动,我没有使它失效计时器,但是当我回到第一个viewController时,如果再次回到第二个viewController,并且如果我按startTimer按钮,则计时器再次从0开始,但是我希望它保留以前的值,我该如何实现呢? 我知道,由于我再次加载viewController,笔尖将重新加载到内存中,但是我如何保留计时器标签和计时器值? 任何帮助将不胜感激。谢谢。

您已将数据放入视图控制器中,从而破坏了MVC(模型-视图-控制器)。 而且,您要问的是一种对时间没有明确承诺的机制( NSTimer )来为您跟踪时间。 NSTimer不会完全按照您请求的间隔触发。 在此间隔之后,它可以在任意任意点触发。 使用 NSTimer作为秒表几乎总是会浪费时间(有时会花费很多时间,尤其是周围有滚动视图时)。 (最后一点被夸大了。重复计时器正确地安排了自己的时间,因此通常不会浪费时间。如果完全跳过重复,您只会浪费时间,这可能发生在长时间滚动或其他可能导致计时器触发的情况下一秒钟。)

创建一个新的模型对象来保存秒表信息。 我们称之为Stopwatch 假设您需要它是可启动和可停止的,则需要一个NSTimeInterval accumulatedTime属性和一个NSDate lastStarted属性(如果需要,还可以将lastStartedNSTimeInterval )。 因此,要启动秒表,请将lastStarted设置为“ now”。 要停止秒表,你清楚lastStarted和移动当前累计的时间accumulatedTime 要找出当前时间,您可以将accumulatedTime时间添加到now - lastStarted

好的,既然您已经拥有了,该怎么办? 您可以将其传递给视图控制器,他们可以询问“当前秒表的值是多少?” 他们可以根据需要启动和停止它。

现在,您的视图控制器希望每秒更新一次其显示,因此您有一个执行此操作的计时器。 它每秒问秒表“当前时间是什么”并显示它。 但这没有设置时间。 它只是问。

顺便说一句,您还可以在Stopwatch上使用KVO,但这有点棘手,因为Stopwatch需要运行自己的计时器来发送更改通知。 我通常觉得这麻烦多于其价值。

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

最好的方法是,必须将NSTimer放入“应用程序代理”中,然后仅在首次加载该View Controller时才启动它。

为了实现这一点,必须放置一个标志以检查是否是第一次加载视图。

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


//NSTimer *timer;  declare this in your interface

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

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

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

希望对您有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM