2017-08-08 1 views
2

Ich versuche, die Hintergrundaufgabe "Finite-Length" in meiner App auszuführen. Allerdings wird mein Code derzeit nicht ausgeführt, bevor die App gesperrt wird.Ausführung der Hintergrundaufgabe, bevor die App in den Status "Ausgesetzt" geht

Ich habe einige Tutorials verfolgt, die behaupten, dass das Folgende der Weg ist, aber offensichtlich bekomme ich etwas falsch. Relevante Code sollte unten gebucht werden (bitte nur für jede Klärung, ob ich etwas fehlt):

class Manager { 

    private var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid 

    init(){ 
     // Add observer able of detecting when app will go to background 
     NotificationCenter.default.addObserver(self, selector: #selector(self.didEnterBackground(_:)), name: .UIApplicationDidEnterBackground, object: nil) 
    } 

    deinit { 
     // Observers removed when view controller is dismissed/deallocated 
     NotificationCenter.default.removeObserver(self) 
    } 

     // Routine performed when app will resign from active 
@objc private func didEnterBackground(_ notification: Notification){ 

    registerBackgroundTask() 

    // Code that needs to be executed before app is suspended ------ 
    DispatchQueue.global().sync { 

     self.isBackgrounding = true 

     self.shutdownSession() 


     self.isConnected = false 
     self.isActivated = false 
     self.activate = false 

     self.connectionManager.closeConnectionToPeripherals() 

    } 
    // ----------------------------------------------------- 
    self.endBackgroundTask() 

} 

func registerBackgroundTask() { 
    backgroundTask = UIApplication.shared.beginBackgroundTask { [weak self] in 
     self?.endBackgroundTask() 
    } 
    assert(backgroundTask != UIBackgroundTaskInvalid) 
} 

func endBackgroundTask() { 
    print("\n\n\nBackground task ended.\n\n\n") 
    UIApplication.shared.endBackgroundTask(backgroundTask) 
    backgroundTask = UIBackgroundTaskInvalid 
} 

} 

ich ein Problem bin vor, wo die Hintergrundaufgabe zu sein scheinen immer beendet, bevor der Code ausgeführt wird. Wie stelle ich sicher, dass der Code in meinem synchronen Block ausgeführt wird, bevor die App angehalten wird?

Ich verstehe auch nicht die "registerBackgroundTask()" - obwohl das Internet darauf besteht, es so zu implementieren - wie es die endBackgroundTask() aufruft.

Antwort

1

Sie müssen Ihren self.endBackgroundTask() Aufruf in Ihren DispatchQueue-Block verschieben, direkt nach self.connectionManager.closeConnectionToPeripherals(). Die Methode registerBackgroundTask ruft nicht direkt self.endBackgroundTask() auf, sondern wird nur aufgerufen, wenn die Hintergrundaufgabe abgelaufen ist. Normalerweise passiert dies, wenn Ihre App die Aufgabe nach ca. 30s im Hintergrund nicht beendet.

+0

Ich habe den Code zu Ihrem Vorschlag umgeordnet, aber die "Hintergrundaufgabe beendet." wird immer noch sofort ausgeführt. Ich weiß, dass die Aufgabe ca. Insgesamt 7 Sekunden, also stimmt etwas immer noch nicht. Könnte es etwas damit zu tun haben, dass ich Funktionen aufruft und sie somit ausgeführt/gestartet, aber nicht intern abgeschlossen werden? – matiastofteby

+1

Ja. Wenn die Funktionen, die Sie anrufen, asynchrone Arbeiten ausführen, kann das System Ihre App einfrieren, bevor sie zurückkehren. Wenn diese Funktionen asynchron sein müssen, müssen Sie sie ändern, indem Sie einen Completion-Block übergeben und 'endBackgroundTask' ausführen, sobald alle zurückgegeben wurden. – ersjoh

Verwandte Themen