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?
Odpowiedz
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. :)
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
Naprawdę doceniam komentarz dotyczący przekroczenia limitu czasu aplikacji applicationDidEnterBackground. – SAHM
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. –
Jeśli pracujesz wielozadaniowo, a aplikacja weszła w tło, dlaczego powinna ponownie przejść przez 'applicationDidEnterBackground' zanim zostanie zabita przez użytkownika? – Larme
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
@Larme Być może dobrym pytaniem jest, kiedy IS applicationWillTerminate wymaga aplikacji, która obsługuje wielozadaniowość. – SAHM