используя 2 NSTimer в тех же UIViewControllers - PullRequest
0 голосов
/ 04 ноября 2011

В моем методе viewDidLoad у меня есть следующее:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self repeatRequest];
    [NSTimer scheduledTimerWithTimeInterval:30.0 target: self selector: @selector(repeatRequest) userInfo: nil repeats: YES];
    [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(onTimer) userInfo:nil repeats:YES];
}

И вот методы, которые вызываются:

- (void) repeatRequest{
    NSLog(@"backgroundRequest");
  }

- (void) onTimer{
    NSLog(@"flip pages");
}

Дело в том, что все работает хорошо для2 минуты, и методы вызываются как установленные ... но после этого все сбивается, и метод onTimer вызывается каждую секунду, а не один раз в пять секунд. И также repeatrequest вызывается чаще, чем должно быть.Кто-нибудь знает, в чем может быть причина?

Ответы [ 2 ]

0 голосов
/ 04 ноября 2011

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

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

0 голосов
/ 04 ноября 2011

Вы на самом деле не дали нам слишком много информации, чтобы работать с ней, но я предполагаю, что по какой-то причине ваш метод viewDidLoad вызывается несколько раз, что приводит к множеству дублирующих таймеров, которые продолжают вызывать ваши repeatRequest и onTimer методы.

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

(Чтобы проверить это, просто добавьте NSLog(@"viewdidload"); в ваш метод viewDidLoad и посмотрите, как часто он вызывается.)

То, что вы действительно должны делать, - это хранить ваши NSTimer экземпляры как ivars (предположим, они называются timer1 и timer2 соответственно), а затем проверять, существуют ли они уже при вызове viewDidLoad:

if (!timer1) timer1 = [NSTimer scheduledTimerWithTimeInterval:30.0 target: self selector: @selector(repeatRequest) userInfo: nil repeats: YES];
if (!timer2) timer2 [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(onTimer) userInfo:nil repeats:YES];
...