Я пытаюсь сохранить некоторые данные локально, а затем загрузить их в серверную часть, когда приложение переходит в фоновый режим.
При локальной записи данных я запускаю некоторые фоновые задачи, чтобы их нельзя было прервать, введя фон.
func writeData() {
self.writingData = BackgroundTask(application: UIApplication.shared)
self.writingData!.begin()
DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async(execute: {
self.writeSomeData()
self.writingData!.end()
self.writingData = nil
})
}
Кроме того, когда приложение переходит в фоновый режим, данные загружаются.
func applicationDidEnterBackground(_ application: UIApplication) {
MemberDataPoster.taskForSendingData = BackgroundTask(application: UIApplication.shared)
MemberDataPoster.taskForSendingData!.begin()
MemberDataPoster.sendData(completion: {
MemberDataPoster.taskForSendingData?.end()
MemberDataPoster.taskForSendingData = nil
}) //some firebase operations so it's async.
}
Подробности фоновой задачи приведены ниже:
class BackgroundTask {
private let application: UIApplication
private var identifier = UIBackgroundTaskInvalid
init(application: UIApplication) {
self.application = application
}
func begin() {
self.identifier = application.beginBackgroundTask(expirationHandler: {
self.end()
})
}
func end() {
if (identifier != UIBackgroundTaskInvalid) {
application.endBackgroundTask(identifier)
}
identifier = UIBackgroundTaskInvalid
}
}
В целом работает, но когда приложение переходит в фоновый режим во время записи данных, «writeData» должен быть завершен до «sendData». Если наоборот, данные будут загружены перед обновлением.
Я не видел, чтобы «sendData» был первым завершен, но я не уверен, что так будет всегда. Есть ли способ убедиться, что «writeData» завершен первым?