2012-01-20 12 views
11

Zajmuję się tworzeniem aplikacji, która musi działać w tle. Jest to aplikacja oparta na lokalizacji, więc działa cały czas, system operacyjny jej nie zabija.iphone - NSTimers w tle

Powinno wysłać pewne informacje co 10 sekund (tylko do debugowania), ustawiam timer, gdy jest on w tle. Ustawiłem punkt przerwania w funkcji, która powinna być wykonywana co 10 sekund, która nigdy nie jest wywoływana, ale jeśli wstrzymam aplikację, a następnie kontynuuję odliczanie czasu, a następnie timer jest wykonywany co 10 sekund bez problemów, dziwne, prawda?

Myślałem, że timer będzie wykonywał tak czy inaczej, gdy nie debugowałem, ale to nie jest tak samo, jak gdybym nie wstrzymywał debugowania.

Moje pytanie brzmi DLACZEGO ?? Timer jest ustawiony poprawnie (zakładam), ponieważ działa po wstrzymaniu, ale tak nie jest.

Wszelkie pomysły?

Sposób ustawić timer jest:

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

I w funkcji połączyć się usługa.

Dzięki.

+0

Chodzi o timery, nie debugowanie; napraw swój tytuł, pls. A czy "cel-c" to najlepsze, co możesz zrobić, aby oznaczyć to pytanie? – matt

+0

możliwy duplikat [NSTimers działa w tle?] (Http://stackoverflow.com/questions/5901398/nstimers-running-in-background) – matt

Odpowiedz

20

Mam podobny wygląd aplikacji i utknąłem na tym samym. Co znalazłem gdzieś w internecie jest dodawanie tego typu oświadczenia applicationDidEnterBackground:

UIBackgroundTaskIdentifier locationUpdater =[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     [[UIApplication sharedApplication] endBackgroundTask:locationUpdater]; 
     locationUpdater=UIBackgroundTaskInvalid; 
    } ]; 

Ten opowiada os, które jeszcze rzeczy się dzieje, a nie do jej zatrzymania.

mam mój zegar dołączony do tej funkcji

//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; 
} 

ustawić licznik w moim moją lokalizację metod menedżer delegata.

Czuję twój ból. Zauważyłem, że te rzeczy były super wybredne. To właśnie dla mnie zadziałało. Mam nadzieję, że to pomoże. Odkryłem, że nie ma żadnych ograniczeń w tym, co możesz zrobić w tle.

+0

dziękuję dużo cwieland, działało idealnie. – subharb

+0

Właściwie to nie naprawiło mojego całego problemu. Teraz otrzymuję dziennik awarii, prawdopodobnie dlatego, że nie kończę zadania w tle, a to dlatego, że zadanie nie powinno się kończyć, dopóki aplikacja jest w tle. NStimer powtórzy się w nieskończoność. Czy to jest możliwe? czy skoro jest to aplikacja lokalizacyjna, powinienem podłączyć działania do GPS? – subharb

+0

Nie jestem do końca pewien, na czym polega awaria. Jestem w stanie utrzymywać połączenie z gniazdem w tle, więc jestem pewien, że nie ograniczasz się tylko do rzeczy związanych z lokalizacją. Ale jak powiedziałem, te problemy nie są najłatwiejsze do rozwiązania. Przepraszam, że nie mogę być bardziej pomocny. Mój timer będzie działać bez końca (o ile widziałem) jedną rzeczą do sprawdzenia jest wydrukowanie backgroundTimeRemaining (nigdy nie powinno się zejść i być bardzo dużym) – utahwithak

0

Mogą istnieć ograniczenia dotyczące tego, co możesz zrobić w tle. Spróbuj dodać timer do pętli przed przejściem w tło. Nawet to może nie działać; Możliwe, że jedynym kodem, który można uruchomić w tle, jest kod wywoływany przez metody lokalizacji podstawowej, na które zapisałeś (np. locationManager:didUpdate...). Ale mam wrażenie, że czasomierze, które są już uruchomione, zanim zaczniesz iść w tle, będą nadal działać.

+0

Ale to nie wyjaśnia, dlaczego jeśli debugowania działa. Tego nie rozumiem. Zakładam, że aplikacja zachowuje się w taki sam sposób, jak debugowanie lub po prostu działa – subharb

+0

Wierzę, że gdybyś spróbował tego, co zasugerowałem (ustaw czasomierz jeszcze na pierwszym planie), rozwiązałbym ten problem. Jest to w rzeczywistości prawdopodobnie to samo, co rozwiązanie, które zaakceptowałeś. Twój problem polegał na tym, że byłeś już w tle i Twój runloop przestał działać przed ustawieniem timera. Wstrzymanie w punkcie przerwania i wznowienie podczas pracy w tle daje twojemu runloopowi nową szansę na uruchomienie, więc w tym momencie timer został dodany do runloopa. To zgadywanie, ale uważam, że wyjaśnia to zjawisko. – matt