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...). Но у меня сложилось впечатление, что таймеры, уже запущенные до того, как вы начнете идти в фоновый режим, продолжат работать.