как распланировать NSTimer в target-c - PullRequest
5 голосов
/ 07 сентября 2011

Я использую вложенный NSTimer в приложении. У меня здесь два вопроса.

  1. Как заново запустить счетчик времени в этой функции - (void)updateLeftTime:(NSTimer *)theTimer
  2. Как убить предыдущий таймер, потому что - (void)updateLevel:(NSTimer *)theTimer также вызывает по таймеру.

- (void)viewDidLoad {
    [super viewDidLoad];

    tmLevel=[NSTimer scheduledTimerWithTimeInterval:20.0f target:self selector:@selector(updateLevel:) userInfo:nil repeats:YES];

    tmLeftTime=[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES];
}

- (void)updateLevel:(NSTimer *)theTimer {
    static int count = 1;
    count += 1;

    lblLevel.text = [NSString stringWithFormat:@"%d", count];

    tfLeftTime.text=[NSString stringWithFormat:@"%d",ANSWER_TIME];

    tmLeftTime=[[NSTimer alloc] init];
    tmLeftTime=[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES];
    [self playMusic];

}
- (void)updateLeftTime:(NSTimer *)theTimer {
    static int timeCounter=1;
    timeCounter+=1;
    tfLeftTime.text=[NSString stringWithFormat:@"%d", (ANSWER_TIME-timeCounter)];
}

Ответы [ 4 ]

17 голосов
/ 07 сентября 2011
  • Используйте [tmLevel invalidate] для отмены расписания таймера.
  • Не забудьте установить tmLevel=nil сразу после (чтобы избежать использования переменной после того, как таймер был незапланирован и выпущен Runloop)
  • Не забудьте аннулировать таймер tmLevel перед потерей ссылки на него, а именно вызывать [tmLevel invalidate] также перед назначением нового NSTimer переменной tmLevel (иначе предыдущий таймер продолжит работать в дополнение к новому )

Обратите внимание, что в вашем коде есть бесполезные выделения, которые, кроме того, создают утечку:

tmLeftTime=[[NSTimer alloc] init];
tmLeftTime=[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES];

здесь вы выделяете экземпляр NSTimer, сохраняете этот экземпляр в tmLeftTime ... и затем сразу же забываете об этом созданном экземпляре, чтобы заменить его другим, созданным с помощью [NSTimer scheduledTimerWithTimeInterval:...]! Поэтому NSTimer, созданный с помощью [[NSTimer alloc] init], теряется и создает утечку (поскольку она никогда не будет выпущена).

Ваша первая строка совершенно бесполезна, вроде как вы делали

int x = 5;
x = 12; // of course the value "5" is lost, replaced by the new value
11 голосов
/ 07 сентября 2011

добавьте следующие строки, когда вы хотите сбросить таймер

[tmLeftTime invalidate]; 
tmLeftTime = nil;

вы также можете использовать

if ([tmLeftTime isValid]){
  // the timer is valid and running, how about invalidating it
  [tmLeftTime invalidate]; 
    tmLeftTime = nil;
}
0 голосов
/ 07 сентября 2011

Сделайте недействительным ваш таймер с помощью метода invalidate в вашем updateLevel: метод и перепланируйте тот же таймер.

[tmLevel invalidate];
tmLevel = [NSTimer scheduledTimerWithTimeInterval:20.0f target:self selector:@selector(updateLevel:) userInfo:nil repeats:YES];

И если вы хотите вызвать метод updateTimeLeft: вам не нужно выделять другой таймер, это большая утечка, поскольку вы никогда не выпускаете эти ссылки.

tmLeftTime = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES];

А в вашем updateTimeLeft: просто перепланируйте метод таймера и установите условие, где он должен остановиться.

tmLeftTime = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES];
0 голосов
/ 07 сентября 2011

Как насчет использования только одного таймера вместо 3?

- (void)viewDidLoad {
    [super viewDidLoad];

    tmLeftTime=[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES];
}

- (void)updateLevel {
    static int count = 1;
    count += 1;

    lblLevel.text = [NSString stringWithFormat:@"%d", count];

    tfLeftTime.text=[NSString stringWithFormat:@"%d",ANSWER_TIME];

    [self playMusic];

}
- (void)updateLeftTime:(NSTimer *)theTimer {
    static int timeCounter=1;
    timeCounter+=1;
    tfLeftTime.text=[NSString stringWithFormat:@"%d", (ANSWER_TIME-timeCounter)];
    if (timeCounter >= ANSWER_TIME) {
        timeCounter = 0;
        [self updateLevel];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...