Iphone - NSTimers в фоновом режиме
Я разрабатываю приложение, которое должно работать в фоновом режиме. Это приложение, основанное на местоположении, поэтому оно работает все время, ОС не убивает его.
Он должен отправлять некоторую информацию каждые 10 секунд (только для отладки), я устанавливаю таймер один раз в фоновом режиме. Я установил точку останова в функции, которая должна выполняться каждые 10 секунд, которая никогда не вызывается, но если я приостанавливаю приложение, а затем продолжаю вызывать таймер, а затем таймер выполняется каждые 10 секунд без проблем, странно?? /p >
Я думал, что таймер будет выполняться в любом случае, когда я не буду отлаживать, но это не так, как если бы я не приостанавливал отладку.
Мой вопрос: ПОЧЕМУ??? Таймер установлен правильно (я предполагаю), так как он работает после паузы, но это не так.
Любые идеи?
Способ установки таймера:
self.timer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(doStuff) userInfo:nil repeats:YES];
И в функции я подключаюсь к веб-сервису.
Спасибо.
Ответы
Ответ 1
У меня есть аналогичный дизайн приложения и застрял на одном и том же. То, что я нашел где-то в Интернете, добавляет этот тип оператора applicationDidEnterBackground:
UIBackgroundTaskIdentifier locationUpdater =[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:locationUpdater];
locationUpdater=UIBackgroundTaskInvalid;
} ];
Это говорит о том, что у вас все еще есть вещи, и не останавливать их.
У меня есть таймер, прикрепленный к этой функции
//this is a wrapper method to fit the required selector signature
- (void)timeIntervalEnded:(NSTimer*)timer {
[self writeToLog:[NSString stringWithFormat:@"Timer Ended On %@",[NSDate date]]];
[self startReadingLocation];
[timer invalidate];
timer=nil;
}
Я устанавливаю таймер в своих методах делегирования менеджера моего местоположения.
Я чувствую твою боль. Я обнаружил, что эти вещи были супертонкими. Это то, что сработало для меня. Я надеюсь, что это помогает. Я обнаружил, что нет никаких ограничений в том, что вы можете сделать в фоновом режиме.
Ответ 2
Могут быть ограничения на то, что вы можете сделать в фоновом режиме. Попробуйте добавить таймер в цикл выполнения, прежде чем идти в фоновый режим. Даже это может не сработать; может быть, что ваш единственный код, который может работать в фоновом режиме, - это код, вызываемый методами Core Location, для которых вы зарегистрировались (например, locationManager:didUpdate...
). Но у меня сложилось впечатление, что таймеры, уже запущенные до того, как вы начнете идти в фоновый режим, продолжат работать.