2015-03-23 4 views
-1

Я новичок в iOS, В моем проекте я использую NSTimer с навигационным контроллером. Я использовал два класса в своем проекте, Класс 1 - ViewController, а 2-й класс - PlayTheme. Классы ViewController и PlayTheme связаны с segue. В классе PlayTheme я использовал NSTimer и метод «FiredTimer method» для каждых 10 миллисекунд. Исходный код PlayTheme класса является: Ниже метод для NSTimer StartNSTimer не останавливается с контроллером навигации

- (IBAction)startTimerMethod:(id)sender 
{ 
    UIBackgroundTaskIdentifier bgTask =0; 
     UIApplication *app = [UIApplication sharedApplication]; 
     bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
      [app endBackgroundTask:bgTask]; 
     }]; 

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

И Ниже Метод Стоп таймер

- (IBAction)stopTimerMethod:(id)sender 
{ 
    if([timer isValid]) 
    { 
     [timer invalidate]; 
     timer=Nil; 
    } 
} 

Оба метода работают, но когда я следующим шагам, описанным ниже Таймер не Стоп:

  1. Я в PlayTheme классе и StartTime
  2. Вернуться к ViewCont Ролик
  3. Come Back To PlayTheme класса
  4. и StopTimer вызов метода, метод вызова, но но не останавливает таймер

Дайте мне предложение для решения моей проблемы, а также рассказать мне, как NSTimer работать в фоновом режиме для воспроизведения звука в течение определенного времени с использованием NSTimer?

Благодарим вас в Advanced.

ответ

0

несколько решений доступны для решения Вашего дела:

  • обескуражен - Либо хранить ссылку на экземпляр NSTimer глобально (взгляните на шаблон проектирования Singleton)
  • Рекомендуемый - Instantiate ваш таймер с первого контроллера представления, чтобы вы всегда сохраняли ссылку на него и, в конечном счете, передавали его в ваш контроллер воспроизведения PlayTheme.

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

VC1 -> VC2 -> VC3 
VC1 -> VC5 
// In such a case, if both VC3 and VC5 need to share an element, 
// this one must be managed by VC1 
0

Когда вы выходите из контроллера воспроизведения PlayTheme, вы теряете ссылку на таймер. Вам нужно будет хранить таймер где-нибудь «глобально», если вы хотите сохранить ссылку на него. Как и где вы это делаете, зависит от структуры вашего приложения.

Редактировать

Чтобы прояснить: я не советую использовать глобалам! Я просто написал это, чтобы указать переменную, которая «существует» в большем количестве мест, а затем только один контроллер. Проверьте ответ @ sweepy_ на возможное решение.

0

Не могли бы вы рассказать, как вы добавили таймер?

Это должно быть, как это -

[[NSRunLoop mainRunLoop] ADDTimer: таймер forMode: NSRunLoopCommonModes];

0

Чтобы создать подкласс фона таймера NSOperation и создать его экземпляр. Кроме того, чтобы сохранить таймер активен в течение определенного интервала времени необходимо указать дату от текущего времени + длительности, как это -

#import <Foundation/Foundation.h> 

@interface BackgroundTimer : NSOperation 
{ 
    BOOL _done; 
} 
@end 



#import "BackgroundTimer.h" 

@implementation BackgroundTimer 

-(void) main 
{ 
    if ([self isCancelled]) 
    { 
     return; 
    } 

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:30 
              target:self 
              selector:@selector(timerFired) 
              userInfo:nil 
              repeats:YES]; 

    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

    //keep the runloop going as long as needed 
    while (!_done && [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode 
               beforeDate:[NSDate dateTillTheSpecificTime]]); 

}

@end