У меня постоянно возникают проблемы с моими NSTimers и селекторами фона.Это сводит меня с ума и очень долго пробует каждый твик.Чтобы сохранить мое здравомыслие и здравомыслие будущих поколений программистов какао, я задаю этот вопрос:
Существует ли абсолютно 100% надежный способ запланированного долгосрочного срабатывания таймера на более позднем этапе?со временем, независимо от того, был ли он вызван из фонового потока, основного потока и т. д.
Кажется, мне приходится снова и снова решать одну и ту же проблему для большинства моих классов, использующих NSTimers.они работают во время кратковременного тестирования, скажем, я установил таймер для запуска через фоновый поток, чтобы он срабатывал через 10 секунд.Это работает, потому что все еще работает цикл выполнения.Но как только я изменяю время огня на то, что я действительно хочу, например, 15-30 минут, наступает мертвая тишина.Цикл выполнения пропал, и я не знаю, как справиться с таким случаем.Ничего не происходит, и я обнаруживаю такие ошибки несколько дней спустя, как только я уже забыл, какой таймер будет отвечать за это.
В настоящее время я делаю очень, очень уродливый танец с селекторами, например, вот тестовый метод (кажется, работает для 10-минутных таймеров):
//this is a test method to simulate a background task requesting a timer
[self performSelectorInBackground:@selector(backgroundReminderLongTermTest:) withObject:nil];
//this is a method similar to the one that the background thread would be trying to invoke
-(void)backgroundReminderLongTermTest:(id)sender
{
[self performSelectorOnMainThread:@selector(backgroundReminderFromMainThread:) withObject:nil waitUntilDone:NO];
}
//this is a wrapper for the background method, I want the timer to be added to a thread with a run loop already established and running
-(void)backgroundReminderFromMainThread:(id)sender
{
[playTimers addObject:[NSTimer scheduledTimerWithTimeInterval:1800 target:self selector:@selector(start:) userInfo:nil repeats:NO]];
}
Мне нравится удобствоне нужно беспокоиться о создании объекта даты пожара с запланированными таймерами, но стоит ли мне просто забыть о них и использовать таймеры с конкретными датами пожара?Кажется, что scheduleTimer хорошо работает для краткосрочных задач, когда цикл выполнения уже присутствует, но я просто не вижу ошибок такого рода во время выполнения приложения.В какой-то момент кажется, что таймеры работают нормально, но в более поздний момент они прекращают работать полностью.
Спасибо за любую помощь или разъяснения. Я ищу метод, который планирует таймеры, не беспокоясь о том, присутствует ли цикл выполнения каждый раз, когда мне нужно запланировать таймер.Я хочу быть уверен, что пока приложение работает, мои таймеры, запланированные с помощью этого метода, будут работать в предсказуемых точках в будущем.