2012-12-05 15 views
7

Czy jest wywoływana przed w aplikacji na iOS? Wiem, że applicationWillTerminate nie zawsze jest wywoływane (wielozadaniowość) - ale kiedy jest wywoływane, czy ZAWSZE jest nazywane najpierw? Nie chcę niepotrzebnie duplikować kodu, dodając go do wersji applicationWillTerminate, jeśli jest już dołączony do applicationDidEnterBackground, dla aplikacji obsługującej wielozadaniowość.Czy applicationDidEnterBackground ZAWSZE zostało wywołane przed applicationWillTerminate?

+0

Jeśli pracujesz wielozadaniowo, a aplikacja weszła w tło, dlaczego powinna ponownie przejść przez 'applicationDidEnterBackground' zanim zostanie zabita przez użytkownika? – Larme

+0

Rozumiem, że jeśli użytkownik zabije aplikację działającą w tle, dwukrotnie naciskając przycisk strony głównej i naciskając czerwony przycisk minusa, to nie jest wywoływana funkcja ApplicationTerminate. Daj mi znać, jeśli się mylę. – SAHM

+0

@Larme Być może dobrym pytaniem jest, kiedy IS applicationWillTerminate wymaga aplikacji, która obsługuje wielozadaniowość. – SAHM

Odpowiedz

5

w iOS 4.0 i nowszym applicationDidEnterBackground jest wywoływane zamiast applicationWillTerminate, więc nie trzeba wywoływać obu tych urządzeń. Oto część docs Apple:

Dyskusja

w iOS 4.0 i później, ta metoda jest wywoływana zamiast applicationWillTerminate: metoda, kiedy użytkownik odchodzi aplikację który wspiera realizację tła . Tej metody należy użyć do udostępnienia zasobów udostępnionych, , zapisania danych użytkownika, unieważnienia liczników czasu i zapisania wystarczającej informacji o stanie aplikacji, aby przywrócić swoją aplikację do stanu w przypadku jej późniejszego zakończenia. Należy także wyłączyć aktualizacje interfejsu użytkownika aplikacji i unikać korzystania z niektórych typów współdzielonych zasobów systemowych (takich jak baza danych użytkownika bazy danych). Konieczne jest także unikanie korzystania z OpenGL ES na tle .

Twoja implementacja tej metody ma około pięciu sekund, aby wykonać dowolne zadania i wrócić. Jeśli potrzebujesz dodatkowego czasu na wykonanie ostatecznych zadań, możesz poprosić o dodatkowy czas wykonania z systemu , wywołując metodę beginBackgroundTaskWithExpirationHandler :. W praktyce powinieneś jak najszybciej powrócić z applicationDidEnterBackground: as . Jeśli metoda nie powróci przed upływem czasu , twoja aplikacja zostanie zakończona i oczyszczona z pamięci.

Należy wykonać wszystkie zadania związane z dostosowaniem interfejsu użytkownika przed zakończeniem tej metody, ale inne zadania (takie jak zapisanie stanu) powinny zostać przeniesione do kolejki równoczesnej wysyłki lub wątku dodatkowego w razie potrzeby. Ponieważ jest prawdopodobne, że jakiekolwiek zadania w tle będą uruchamiane w aplikacji applicationDidEnterBackground: nie będą działać, dopóki ta metoda nie zostanie zakończona, należy przed wykonaniem tych zadań poprosić o dodatkowy czas wykonania w tle przed wykonaniem . Innymi słowy, najpierw zadzwoń pod numer beginBackgroundTaskWithExpirationHandler: a następnie uruchom zadanie w kolejce wywołania lub wątku dodatkowym .

Aplikacja również księguje powiadomienie UIApplicationDidEnterBackgroundNotification wokół jednocześnie wywołuje tę metodę, aby dać zainteresowanym obiektom szansę reagują na przejściu.

Aby uzyskać więcej informacji o tym, jak przejść z wdziękiem na tło , oraz aby uzyskać informacje na temat uruchamiania zadań w tle o godzinie zakończenia , zobacz Podręcznik programowania aplikacji iOS.

Mam nadzieję, że to pomoże ci rozwiązać problem. Adrian

Oto link do notatki technicznej, która jest dostępna w sekcji dla programistów. Zajmuje się tworzeniem sieci i wielozadaniowości. Rzeczywista metoda zastosowana w tym dokumencie dotyczy tylko applicationDidEnterBackground, a ponieważ iOS 5 mają system o nazwie watchdog, który kończy aplikację, jeśli sieć nie odpowiada automatycznie. W związku z tym nie ma potrzeby dzwonienia pod numer applicationWillTerminate i próby uruchomienia kodów, aby aplikacja mogła ukończyć swoje zadanie przed zakończeniem aplikacji. Aplikacja wejdzie w tło i będzie kontynuować swoje zadanie aż do ukończenia ostatniego zadania. Mam nadzieję, że ma to sens, ale tutaj jest link. Przeczytaj sekcję strażniczą. https://developer.apple.com/library/ios/#technotes/tn2277/_index.html#//apple_ref/doc/uid/DTS40010841

Mam nadzieję, że to pomoże. :)

+0

Dzięki, zrozumiałem to i mam wszystkie niezbędne kody w applicationDidEnterBackground. Po prostu próbuję dowiedzieć się, który kod należy uwzględnić w applicationWillTerminate, a który pominąć. – SAHM

+0

Naprawdę doceniam komentarz dotyczący przekroczenia limitu czasu aplikacji applicationDidEnterBackground. – SAHM

+0

Nawet nie wołam nic w aplikacji, to już zakończę metodę. Po prostu zostawiam to jako domyślne, które pojawia się podczas tworzenia niezbędnych widoków. począwszy od ios 5, które wywoływałam wszystkie metody w aplikacji, wprowadzałem tło i działa to dobrze dla mnie. nie wiem o żadnym innym, co się stało. –

Powiązane problemy