2015-03-13 4 views
2

Я работаю над приложением iOS, которое предоставляет/делает вызовы из приложения. Мы можем совершать два звонка один за другим. Первый раз мы делаем первый звонок. Как только звонок будет установлен, NSTimer должен быть запущен, и на нем будет отображаться продолжительность вызова.Проблема при использовании 2 NSTimers

Для этого я делаю следующий для таймера

self.switchTimer1 = [NSTimer scheduledTimerWithTimeInterval:1.0 
           target:self 
           selector:@selector(setTimerLabel1:) 
           userInfo:nil 
           repeats:YES]; 

[self.switchTimer1 fire]; 

после установления этого первого вызова, пользователь может сделать второй вызов.

Как только второй звонок будет установлен, он будет запускать второй таймер.

if (hasSecondCall) 
{ 

    self.switchTimer2 = [NSTimer scheduledTimerWithTimeInterval:1.0 
            target:self 
            selector:@selector(setTimerLabel2:) 
            userInfo:nil 
            repeats:YES]; 

    timeSec=0; 

    timeMin=0; 

    [self.switchTimer2 fire]; 

} 

Он работает нормально, делая первый раз оба вызова.

Предположим, что если я закончил 2-й вызов и снова сделал звонок, то время 2-го таймера перед установкой вызова таймер автоматически вызывается и один раз устанавливается, значение увеличения таймера очень быстро, как показано двойным значением. Мол, 2,4, 6 и т.д.

Для secondtimer после метода обжига следующих

- (void)setTimerLabel2:(NSTimer *)timer { 

    timeSec=timeSec+1; 

    NSLog(@"timeSec+1 %d",timeSec+1); 

    if (timeSec == 60) 
    { 
     timeSec = 0; 
     timeMin=timeMin+1; 
    } 

    NSString* timeNow = [NSString stringWithFormat:@"%02d:%02d", timeMin, timeSec]; 

    [_switchCallLCD setStatus:timeNow labelNumber:2]; 
} 

Во время отсоединения вызова мы вызывая следующие

- (void)endingCallWithId:(UInt32)call_id { 

    if (hasSecondCall&& call_id==_current_call) { 

     if (self.switchTimer2) { 

      //NSLog(@"self.predictNumber %@",self.predictNumber); 
      self.predictNumber=self.predictNumber2; 
      [_lcd setText:self.predictNumber]; 

      [self.switchTimer2 invalidate]; 
      self.switchTimer2 = nil; 
      [self.switchTimer2 release]; 
      [_switchCallLCD setStatus:NSLocalizedString(@"call ended",nil) labelNumber:2]; 

      timeSec = 0; 
      timeMin = 0; 
     } 

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

+0

@Anna спасибо за отредактированный мой вопрос –

+0

Что такое переменные экземпляра '_current_call',' timeSec' и 'TimeMin'? Обычно мы используем свойства для ivars. Где называется 'endCallWithId'? Кажется, вы не используете ARC ('[self.switchTimer2 release]'), это не очень хорошая идея. – zaph

+0

У моего приложения есть несколько файлов arc и некоторые из не-дуги, но этот файл не дуги // В заголовке я объявлял их, хотя я выпустил их в методе dealloc, ничего не меняется в статусе таймера int timeSec = 0; int timeMin = 0; –

ответ

0

Возможно, у вас есть предыдущий экземпляр таймера (ов). Когда вы делаете второй набор вызовов, у вас есть 2 экземпляра switchTimer1 и 2 экземпляра switchTimer2.

Как только вы завершение вызова, необходимо аннулировать таймер:

[self.switchTimer1 invalidate]; 

, а затем установить его на ноль для хорошей меры:

self.switchTimer1 = nil; 
+0

после того, как я отключил второй вызов, все еще выполняется первый вызов @Duncan c, после этого закончился второй вызов, я делаю еще один вызов , в этот раз я столкнулся с этой проблемой. –

+0

Я вижу, что вы опубликовали код, который показывает вам недействительность второго таймера. Как насчет кода, чтобы аннулировать первый таймер? Если вам нужна помощь в выяснении ваших проблем, вы должны опубликовать все соответствующие коды. –

+0

Я поместил этот код из-за увеличения количества кода здесь. Я также делаю этот первый таймер недействительным после того, как вызов будет отключен. но его работа хорошая. @Duncan c –