NSTimer не будет признан недействительным в viewWillDisappear

#ios #objective-c

#iOS #objective-c

Вопрос:

 @property (weak, nonatomic) NSTimer *timer;

-void()timerMethod
{
    ...some stuff
    [self.timer invalidate];
    self.timer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(refreshScreen:) userInfo:nil repeats:NO];
}

-void(refreshScreen:id(sender)
{
...some stuff that calls other methods one of which calls timerMethod to continue the process
}

-(void)viewWillDisappear:(BOOL)animated
{
   [self.timer invalidate];
   self.timer = nil;
}
  

Когда я перехожу на новый VC, вызывается viewWillDisappear, и я подтверждаю это
1/ таймер признан недействительным (с использованием [self.timer isValid].
2 / Мы находимся в основном потоке (используя [NSThread isMainThread]
3 / таймер равен нулю

Сам таймер при создании также подтверждается в основном потоке.

Через несколько секунд на другом VC таймер вызывает метод «refreshScreen» независимо от вышеупомянутого.

Я проверил, что значение invalidate в timerMethod становится недействительным с каждым проходом. Я делаю это, чтобы гарантировать, что не создано более 1 таймера. Точки останова показывают, что, хотя таймер становится недействительным и равен нулю при выходе, как только он снова вызывает «refreshScreen», он восстановил таймер и больше не равен нулю, несмотря на то, что его VC был отклонен.

Комментарии:

1. Вам не нужно добавлять [super viewWillDisappear: анимированный]?

2. К сожалению, добавление этого ничего не меняет.

3. К сожалению, вы упростили код до такой степени, что проблемы не существует. Запуск этого кода в простом тестовом приложении, в котором есть контроллер навигации и два контроллера просмотра, не вызывает проблемы.

4. Я не уверен, что еще добавить. Другие вещи в любом случае не вызывают и не используют таймер. Я нашел «self.timer», чтобы убедиться, что это не вызывалось в другом месте. Процедура обновления вызывает некоторые методы, которые выполняют некоторую подготовку, а затем вызывается метод, содержащий таймер (timerMehod, который я описал выше). Я полагал, что куча кода, устанавливающего несвязанные переменные и элементы экрана, просто создаст шум.

5.Я согласен, что вы не хотите слишком много шума, но единственная теория, которую я могу придумать, заключается в том, что refreshScreen каким-то образом все еще выполняется, когда представлен другой VC, так что timerMethod вызывается после viewWillDisappear . Это будет означать, что refreshScreen в фоновом потоке выполняется код, и фоновый поток отправляет сообщение в основную очередь для вызова timerMethod . Я знаю, что это настоящая натяжка 🙂 но это лучшее, что я могу придумать, не видя refreshScreen .