2012-06-07 1 views
0

У меня есть приложение, которое регулярно посещает сервер. Опрос выполняется с использованием задачи таймера. Таймер должен использоваться только на одном экране, поэтому, когда я перехожу на другой экран, таймер становится недействительным.NSTimer - создано несколько экземпляров

Я заметил, что иногда таймер становится недействительным, но иногда нет. И когда он не является недействительным, несколько экземпляров продолжают создаваться.

Я инициализирован таймер следующим образом:

timer = [NSTimer scheduledTimerWithTimeInterval: 2 
             target: self 
             selector: @selector(timerTask:) 
             userInfo: nil 
             repeats: YES]; 

И аннулированы следующим образом:

if(timer){ 

    [timer invalidate]; 
    timer = nil; 


} 

Пожалуйста, помогите, что нужно сделать в этом случае.

Заранее спасибо.

ответ

1

Вы создаете несколько таймеров? В коде отрезала вы писали выше, если таймер уже определен при выполнении:

timer = [NSTimer scheduledTimerWithTimeInterval: 2 
            target: self 
            selector: @selector(timerTask:) 
            userInfo: nil 
            repeats: YES]; 

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

+0

Да, когда пользователь возвращается к исходному экрану, на котором нужно выполнить опрос, я перезапускаю таймер. Проблема в основном возникает, когда я перехожу к следующему экрану -> таймер останавливается -> экран 2 вызывается -> обратная кнопка нажата -> вид удаляется из супервизора -> и здесь создается новый экземпляр. Я думаю, что это вызывает проблемы. Мне нужно, чтобы таймер возобновлялся, когда назад попал – iOSDev

+0

Как это можно достичь? – iOSDev

0

Невозможно «возобновить» NSTimer. Вы можете создать пару свойств, чтобы отслеживать дату (включая время) при создании таймера и при вызове экрана 2. Когда вы переходите на экран 2, аннулируйте таймер, когда вы вернетесь к экрану 1, получите разницу во времени между двумя объектами даты, вычтите это из времени, которое вы хотите между опросом, и создайте новый таймер с этим временным интервалом. Это, по-видимому, будет «возобновлением» таймера для пользователя.

0

Я думаю, вы должны retainNSTimer объект.

timer = [[NSTimer scheduledTimerWithTimeInterval: 2 
              target: self 
             selector: @selector(timerTask:) 
             userInfo: nil 
             repeats: YES] retain]; 

и аннулированию

if(timer){ 

    [timer invalidate]; 
    [timer release]; 
    timer = nil; 
} 
+0

Если я отпущу таймер, приложение терпит крах – iOSDev

1

Вы должны, вероятно, создать 2 различных методов starting и stopping таймера следующим образом.

-(void)startTimer { 

    if([timer isValid]) { 
     [timer invalidate]; 
     timer = nil; 
     } 

    timer = [NSTimer scheduledTimerWithTimeInterval: 2 
           target: self 
           selector: @selector(timerTask:) 
           userInfo: nil 
           repeats: YES]; 
} 

-(void)stopTimer { 

    if([timer isValid]) { 
     [timer invalidate]; 
     timer = nil; 
    } 
    } 

Это позволяет start таймер, и если экземпляр уже действительно будет недействительным и начать новую. Остановка его приведет к ее недействительности, и timer готов к инициализации при следующем вызове startTimer.

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

+0

Я сделал это, но все тот же вопрос ... пожалуйста, помогите .. застрял до сих пор – iOSDev