iphone - NSTimers в фоновом режиме - PullRequest
11 голосов
/ 20 января 2012

Я разрабатываю приложение, которое должно работать в фоновом режиме.Это приложение, основанное на определении местоположения, поэтому оно работает постоянно, ОС не убивает его.

Оно должно отправлять некоторую информацию каждые 10 секунд (только для отладки), я устанавливаю таймер, когда он работает в фоновом режиме.,Я установил точку останова в функции, которая должна выполняться каждые 10 секунд, которая никогда не вызывается, но если я приостанавливаю приложение, а затем продолжаю вызываться таймер, а затем таймер выполняется каждые 10 секунд без проблем, странно, верно?

Я думал, что таймер будет работать в любом случае, когда я не отлаживал, но это не так, как если бы я не приостанавливал отладку.

Мой вопрос - ПОЧЕМУ??Таймер установлен правильно (я полагаю), так как он работает после паузы, но это не так.

Есть идеи?

Способ установки таймера:

self.timer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(doStuff) userInfo:nil repeats:YES];

А в функции я подключаюсь к веб-сервису.

Спасибо.

Ответы [ 2 ]

20 голосов
/ 20 января 2012

У меня похожий дизайн приложения, и я застрял на одном и том же предмете. То, что я нашел где-то в Интернете, добавляет этот тип заявления 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;
}

Я установил таймер в методах делегата моего менеджера местоположения.

Я чувствую твою боль. Я обнаружил, что эти вещи были супер привередливы. Это то, что сработало для меня. Я надеюсь, что это помогает. Я обнаружил, что нет никаких ограничений в том, что вы можете делать в фоновом режиме.

0 голосов
/ 20 января 2012

Могут быть ограничения на то, что вы можете делать в фоновом режиме.Попробуйте добавить таймер в цикл выполнения, прежде чем переходить в фоновый режим.Даже это может не сработать;может случиться так, что единственный ваш код, который может работать в фоновом режиме, - это код, вызываемый методами основного местоположения, на которые вы подписаны (например, locationManager:didUpdate...).Но у меня сложилось впечатление, что таймеры, уже запущенные до того, как вы начнете уходить в фоновый режим, продолжат работать.

...