Używam Alamofire do nawiązania połączenia z serwisem internetowym, który ładuje się dość długo. Jeśli aplikacja trafi w tło, utknę z moim programem ładującym po powrocie do aplikacji. Wyobrażam sobie, że to dlatego, że wywołanie nigdy nie zwraca niczego do mojego programu obsługi zakończenia. Jak mogę rozwiązać ten problem?Żądanie Alamofire zostaje zablokowane podczas wprowadzania tła?
Odpowiedz
Możesz użyć pobierania w tle, aby rozwiązać ten problem. Można to zrobić w następujący sposób w Swift 3:
var backgroundTask: UIBackgroundTaskIdentifier? // global variable
backgroundTask = UIApplication.shared.beginBackgroundTask(withName: "backgroundTask") {
// Cleanup code should be written here so that you won't see the loader
UIApplication.shared.endBackgroundTask(self.backgroundTask!)
self.backgroundTask = UIBackgroundTaskInvalid
}
Zadzwoń do serwisu alamofire po tej linii. W module obsługi zakończenia zakończ zadanie za pomocą poniższych wierszy.
UIApplication.shared.endBackgroundTask(self.backgroundTask!)
self.backgroundTask = UIBackgroundTaskInvalid
Należy pamiętać, że aplikacja ma trochę czasu tła (backgroundTimeRemaining
właściwość) pozostały, zanim wejdzie w stan nieaktywny. Musisz wykonać swoje zadanie przed tym czasem. Program obsługi jest wywoływany na krótko przed upływem pozostałego czasu tła. Ponadto każde wywołanie metody beginBackgroundTask(withName:){}
musi być zrównoważone przez pasujące wywołanie do metody endBackgroundTask:
.
Aby powyższy kod zadziałał, musisz dostosować ustawienia w swojej aplikacji. Idź do „celów” i kliknij na „Możliwości”, aby wprowadzić następujące zmiany
Po tym, przejdź do pliku Info.plist i otwórz go jako źródło, aby dodać następujący kod.
Mam nadzieję, że to pomaga. Jeżeli chcą Państwo uzyskać bardziej szczegółowe informacje, linki te mogą pomóc
http://stackoverflow.com/questions/34328678/web-service-call-in-background-mode -ios – Sofeda
http://redth.codes/ios7-recipe-background-fetching/ – Sofeda
te mogą ci pomóc – Sofeda