Как определить централизованный таймер для приложения в iphone? - PullRequest
3 голосов
/ 19 июля 2011

Мне нужно выполнять определенные задачи (много задач) с разными интервалами.Как я могу реализовать это с одним экземпляром NStimer, поскольку отдельные таймеры будут создавать накладные расходы?

Ответы [ 4 ]

3 голосов
/ 19 июля 2011

Я делаю именно эту вещь.в моем 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];

}

в методе "awakefromnib" класса appdelgate у меня есть это:

[self startupThreads];

Теперь в методе 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;
}

Надеюсь, это поможет:)

2 голосов
/ 19 июля 2011

Вы можете использовать NSNotificationCenter для определения уведомления, и в определенное время он отправляет уведомление, чтобы другой класс мог быть уведомлен и выполнить некоторую задачу соответственно ...

см. этот урок ...

1 голос
/ 09 октября 2011

Я должен был использовать это в своем приложении для 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
}

Просто измените интервалы обновления, и все будет хорошо!

1 голос
/ 19 июля 2011

Определите в приложении делегата и получите доступ к нему в другом месте с помощью общего приложения UIApplication.Надеюсь, это поможет

...