为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用NSTimer?

如何使用NSTimer?

iOS
慕勒3428872 2019-06-06 16:13:43
如何使用NSTimer?如何使用NSTimer?有人能给我一步的指示吗?
查看完整描述

3 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

首先,我想提请您注意Cocoa/CF文档(这始终是一个伟大的第一端口)。Apple文档在每篇参考文章的顶部都有一个叫做“Companion Guides”的部分,其中列出了文档主题的指南(如果有的话)。例如,用NSTimer文献列出两个配套指南:

对于您的情况,Timer编程主题的文章可能是最有用的,而线程主题是相关的,但不是最直接与所记录的类相关的。如果您查看Timer编程主题文章,它分为两部分:

  • 定时器
  • 使用计时器

对于采用这种格式的文章,通常会概述类及其用途,然后介绍一些示例代码多么,怎样若要使用它,请在本例中的“使用计时器”部分中使用。有关于“创建和调度计时器”、“停止计时器”和“内存管理”的部分。从本文中,可以创建一个计划好的、不重复的计时器,如下所示:

[NSTimer scheduledTimerWithTimeInterval:2.0
    target:self
    selector:@selector(targetMethod:)
    userInfo:nil
    repeats:NO];

这将创建一个在2.0秒后触发并调用的计时器targetMethod:在……上面self使用一个参数,该参数是指向NSTimer举个例子。

如果您想更详细地查看该方法,您可以参考文档获得更多信息,但是代码也有解释。

如果要停止重复的计时器(或在不重复计时器触发前停止它),则需要保留指向NSTimer实例;这通常需要是一个实例变量,以便您可以在另一个方法中引用它。然后你可以打电话给invalidateNSTimer例如:

[myTimer invalidate];myTimer = nil;

这也是很好的做法nil退出实例变量(例如,如果使计时器无效的方法被多次调用,而实例变量尚未设置为nilNSTimer实例已被解除分配,它将引发异常)。

还请注意本文末尾关于内存管理的要点:

因为Run循环从内存管理的角度来维护计时器。通常情况下,在调度计时器之后,不需要保留对它的引用..由于计时器在将其方法指定为选择器时作为参数传递,在适当的情况下,可以在该方法中使重复计时器失效。..然而,在许多情况下,您还想要使计时器无效的选项-甚至在计时器开始之前。在这种情况下,您确实需要保持对计时器的引用,以便在适当的时候发送一条无效消息。..如果您创建了一个非计划计时器(请参阅“非计划计时器”),那么您必须维护对计时器的强烈引用(在引用计数环境中,您保留它),以便在使用它之前不会将它释放。


查看完整回答
反对 回复 2019-06-06
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

有几种使用计时器的方法:

1) 计划计时器&使用选择器

NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 2.0
                      target: self
                      selector:@selector(onTick:)
                      userInfo: nil repeats:NO];
  • 如果将重复设置为“否”,则计时器将在运行选择器之前等待2秒,然后停止运行;
  • 如果重复:是的,计时器将立即启动,并将重复调用选择器每2秒;
  • 若要停止计时器,请调用计时器的-无效方法:[t无效];

另外,您可以使用以下简单语句,而不是使用不重复的计时器,而是在指定的间隔之后调用选择器:

[self performSelector:@selector(onTick:) withObject:nil afterDelay:2.0];

这将具有与上面的示例代码相同的效果;但是如果您想每隔第九次调用选择器,则使用带有重复的定时器:是的;

2) 自定时器

NSDate *d = [NSDate dateWithTimeIntervalSinceNow: 60.0];NSTimer *t = [[NSTimer alloc] initWithFireDate: d
                              interval: 1
                              target: self
                              selector:@selector(onTick:)
                              userInfo:nil repeats:YES];NSRunLoop *runner = [NSRunLoop currentRunLoop];
                              [runner addTimer:t forMode: NSDefaultRunLoopMode];[t release];
  • 这将创建一个定时器,该定时器将在您指定的自定义日期(在本例中为一分钟后)启动,并且每隔一秒重复一次。



3) 计划外计时器&使用调用

NSMethodSignature *sgn = [self methodSignatureForSelector:@selector(onTick:)];NSInvocation *inv = [NSInvocation invocationWithMethodSignature:
 sgn];[inv setTarget: self];[inv setSelector:@selector(onTick:)];NSTimer *t = [NSTimer timerWithTimeInterval: 1.0
                      invocation:inv 
                      repeats:YES];

在此之后,您可以在需要时手动启动计时器,如下所示:

NSRunLoop *runner = [NSRunLoop currentRunLoop];[runner addTimer: t forMode: NSDefaultRunLoopMode];



作为注释,onTick:Method如下所示:

-(void)onTick:(NSTimer *)timer {
   //do smth}


查看完整回答
反对 回复 2019-06-06
?
慕后森

TA贡献1802条经验 获得超5个赞

就像这样:

NSTimer *timer;

    timer = [NSTimer scheduledTimerWithTimeInterval: 0.5
                     target: self
                     selector: @selector(handleTimer:)
                     userInfo: nil
                     repeats: YES];


查看完整回答
反对 回复 2019-06-06
  • 3 回答
  • 0 关注
  • 479 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信