#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
.