аннулирование и создание NSTimer

Каждый раз, когда я заканчиваю работу со своим NSTimer, я хочу сделать его недействительным и создать новый интервал, но он сохраняет как старый, так и новый интервал. Я хочу аннулировать NSTimes после нажатия кнопки offButton. Таймер перестает печатать «Работает», но когда я вызываю свой метод с другим интервалом, он печатает «Работает» для обоих интервалов.

Мой код выглядит примерно так:

-(void) fireTimer{
    NSString *textValue = [sliderLabel text];
    float value = [textValue floatValue];

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

}

- (void) vibrate:(NSTimer*)timer {
    if(_offButton.selected){
        [timer invalidate];
        timer=nil;
    }

    NSLog(@"Working");


}

person Arda Keskiner    schedule 23.02.2013    source источник
comment
ЗАДАЧА РЕШЕНА. Только что добавил {[_timer2 invalidate]; _timer2=nil;} в действии offButton.   -  person Arda Keskiner    schedule 23.02.2013


Ответы (2)


  1. Вы не следуете шаблону проектирования MVC, получая значения непосредственно из файла UITextField. Эти значения должны храниться в объекте модели с использованием шаблона MVC для получения любых новых значений из текстового поля в модели. Ваша текущая реализация очень тонкая и сломается при малейшем ветре. Также требуется, чтобы этот код имел доступ к элементам пользовательского интерфейса, что очень негибко; будет лучше предоставить ему доступ только к объекту модели.

  2. Сохраните NSTimer * как переменную экземпляра и обратите внимание, что если вы используете ARC, то NSTimer сохраняет цель (!!), поэтому сделайте эту переменную экземпляра __weak, чтобы прервать цикл сохранения.

  3. Если вы хотите, чтобы ваш таймер повторялся, вам вообще не нужно его сбрасывать; это нужно делать только в том случае, если пользователь меняет время (см. пункт 1!).

  4. Переместите код if (button_selected) do_vibrate; в метод timer fired.

person trojanfoe    schedule 23.02.2013

Код аннулирования, который вы используете, правильный. Но вам было бы проще сохранить ссылку на свой таймер как на ивар или свойство.

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

person Rok Jarc    schedule 23.02.2013