2010-10-29 86 views
0

我想创建一个重复两次然后停止并使其自身失效的NSTimer。如果可能的话,我宁愿不使用循环。有关我如何做到这一点的任何想法?如何创建重复两次然后停止的NSTimer

+0

你可以安装两个单次计时器。 – 2010-10-29 17:13:42

回答

2

在您的定时器代理函数中创建一个静态int,该函数初始化为0.
每次调用委托时都增加它。
当计数器达到您希望使计时器无效的值时。

1

这是你的计时器的目标应该处理的事情,而不是计时器本身应该处理的事情。您可以安装一个重复定时器,并在第二次触发时让目标失效,或者您可以安装一次性定时器,在第一次触发后重新安装,然后在第二次再次设置。

-1

一种解决方案可能与此类似。

启动定时器

[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(timerMethod:) userInfo:nil repeats:YES]; 

处理计时器和重复

int repetitions = 2; //EDIT: remove static declaration (see below) 

- (void)timerMethod:(NSTimer*)theTimer{ 
    NSLog(@"Timer fired"); 
    repetitions--; 

    if(repetitions == 0){ 
     [theTimer invalidate]; 
     NSLog(@"Timer stopped"); 
    } 
} 

编辑: 我除去上述静电改性剂,使一个更通用的示例。静态的最初意图是将定时器持续到类似类型的对象上,这是OP没有做出的请求。

+0

因为全局变量是灾难的秘诀,因此被低估。 – 2010-10-29 18:08:10

+0

尤其是当静态修饰符使它们没有意义时。 – KevinDTimm 2010-10-29 18:10:17

+0

这是为了在一些类定义中的静态。 – 2010-10-29 18:14:04

0

基本上,您需要一个状态机状态变量,可以从初始化定时器的例程和计时器的目标中访问状态机状态变量。

设置状态变量以允许第一次调用定时器任务来重新启动定时器,但是在该调用中还会设置该状态变量,以便后续调用不会重新启动。

请注意,这种状态变量可以用于任意数量的定时器任务重复,只需简单地递减它即可。

状态机几乎是所有(同步)数字芯片和逻辑的工作原理。

0

我非常不同意杰里米认为这是目标应该处理的事情。事实上,我非常不同意,我已经创建了我自己的基于NSTimer的Timer类,您可以详细配置它。

- (void) doSomething: (Timer*) timer 
{ 
    NSLog(@"This is iteration %d", timer.currentIteration); 
} 

- (void) startDoingSomething 
{ 
    Timer* timer = [Timer new]; 
    timer.interval = 5.0; // Fire every 5 seconds 
    timer.delay = 2.5; // Start firing after 2.5 seconds 
    timer.iterations = 3; // Only fire three times 
    timer.target = self; 
    timer.selector = @selector(doSomething:); 
    [timer schedule]; 

    // Don't forget to release timer somewhere - the above is just an example 
} 

http://github.com/st3fan/ios-utils