如何在iPhone中为app定义集中计时器?

时间:2011-07-19 04:11:12

标签: iphone nstimer

我需要以不同的间隔执行某些任务(许多任务)。如何使用单个NStimer实例实现它,因为单个计时器会产生开销?

4 个答案:

答案 0 :(得分:3)

我正在做这件事。  在我的appdelegate中,我有一个计时器和线程的方法(我为了简单起见删除了线程):

-(void)startupThreadsAndTimers{   
    //updatetime
    timer = [NSTimer scheduledTimerWithTimeInterval:(1) 
                                             target:self 
                                           selector:@selector(updateTime) 
                                           userInfo:nil
                                            repeats:YES];
}

我有一个定时器触发的方法

-(void)updateTime{
    [[NSNotificationCenter defaultCenter] postNotificationName: @"PULSE" object: nil];

}

在appdelgate类的“awakefromnib”方法中我有这个:

[self startupThreads];

现在在viewcontrollers上的veiwdidload方法中需要订阅这个(更新时钟)我订阅了通知中心:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateTimeLeft) name:@"PULSE" object:nil];

我有一个名为“updateTimeLeft”的方法

这非常有效,但我会重新审视它以便稍后使用线程获得一些性能。

要让事物以不同的间隔触发,您可以更改这些选择器以解析时间值,并让订阅视图控制器使用模数来决定要做什么。

即。

switch (timerValue % 15){
 case 1:
   [self someMethod];
   break;
 case 2: 
   [self someOtherMethod];
   break;
}

希望这会有所帮助:)

答案 1 :(得分:2)

您可以使用NSNotificationCenter定义通知,并在特定时间调度通知,以便通知其他类并相应地执行某项任务...

参考this tutorial...

答案 2 :(得分:1)

在app delegate中定义并使用UIApplication sharedApplication在其他地方访问它。 希望这有帮助

答案 3 :(得分:1)

我必须在我的iPhone应用程序中使用它,这就是我所做的:

#define kUpdateInterval(x) (iPerformanceTime % x == 0)

int iPerformanceTime;

-(void) mPerformanceGameUpdates {    
    if (iPerformanceTime == 0) { //Initialization

    }

    if (kUpdateInterval(1)) { //Every 1sec

    }

    if (kUpdateInterval(2)) { //Every 2sec

    }

    if (kUpdateInterval(5)) { //Every 5sec

    }

    if (kUpdateInterval(10)) { //Every 10sec

    }

    if (kUpdateInterval(15)) { //Every 15sec

    }

    if (kUpdateInterval(20)) { //Every 20sec

    }

    if (kUpdateInterval(25)) { //Every 25sec

    }

    iPerformanceTime ++;
 }

//The method below helps you out a lot because it makes sure that your timer
//doesn't start again when it already has, making it screw up your game intervals
-(void) mPerformanceTmrGameUpdatesLoopShouldRun:(BOOL)bGameUpdatesShouldRun {
    if (bGameUpdatesShouldRun == TRUE) {
        if (bPerformanceGameUpdatesRunning == FALSE) {
            tmrPerformanceGameUpdates = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(mPerformanceGameUpdates) userInfo:nil repeats:YES];
            bPerformanceGameUpdatesRunning = TRUE;
        }
    } else if (bGameUpdatesShouldRun == FALSE) {
        if (bPerformanceGameUpdatesRunning == TRUE) {
            [tmrPerformanceGameUpdates invalidate];
            bPerformanceGameUpdatesRunning = FALSE;
        }
    }
}

-(void) viewDidLoad {
    [self mPerformanceTmrGameUpdatesLoopShouldRun:TRUE];
    //TRUE makes it run, FALSE makes it stop
}

只需更改更新间隔即可开始使用!