2014-09-16 2 views
0

Итак, мне нужно запустить таймер в приложение метода делегат applicationDidEnterBackground:Нужна глобальная переменная NSTimer, или нечто подобное

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    globalBackgroundTimer = [NSTimer timerWithTimeInterval:30 invocation:nil repeats:NO]; 
} 

таймер объявлен как и в приложении delegate.h:

extern NSTimer * globalBackgroundTimer; 

В то время как таймер работает, я получаю обновления фонового местоположения (включен в plist), в контроллере представления, и я хочу постоянно проверять в locationManager: didUpdateLocations: Истек срок таймера, чтобы я мог завершить обновление местоположения ,

... //code omitted 
//this is called repeatedly when the app is in the background, and checks whether the global variable is instantiated, and if it has expired. 
if(globalBackgroundTimer) 
{ 
    NSLog(@"timer alive"); 
    if(!globalBackgroundTimer.isValid) 
    { 
     [locationManager stopUpdatingLocation]; 
     NSLog(@"background timer invalid, stopping location updates"); 
    } 
} 

Но я не могу заставить его работать (ошибка Mach-O-линкер), однако я также читал, что этот подход был опрометчивым. Так что вы предлагаете?

+1

Вы добавили 'NSTimer * globalBackgroundTimer;' к одному .m файл (за пределами любого класса), такие как приложение делегировать файл .m? – rmaddy

+0

Это фактически сделало переменную работу, спасибо! Следующая проблема заключается в том, что по какой-то причине таймер не делает себя недействительным. Из того, что я могу прочитать, он должен признать себя недействительным, если repeat = NO. но код никогда не попадает в if (! globalBackgroundTImer.isValid) Редактировать --- Изменение его на запланированный таймер заставило его работать. :) Не могли бы вы объяснить, почему я должен добавить NSTimer * globalBackgroundTimer в файл .m? – Anders

ответ

0

Выясните механизм хранения состояния таймера при входе приложения в фоновый режим (изолированная программная среда NSUserDefaults или Documents). Затем, когда приложение переходит на передний план, пересчитайте разницу, используя сохраненную вами информацию NSDate.

(я понимаю, что это, возможно, уже было то, что вы делаете, прежде чем отвечал на этот вопрос.)

Смежные вопросы