我正在尝试在本地保存一些数据,然后在应用程序进入后台时将其上传到后端。
在本地写入数据时,我启动了一些后台任务,以使输入背景不会被打断。
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
}
}
通常可以使用,但是当应用程序在写入数据的中间进入后台时,必须在“ sendData”之前完成“ writeData”。反之亦然,数据将在更新之前上传。
我没有看到“ sendData”首先完成,但是我不确定它是否总是那样。有什么方法可以确保“ writeData”首先完成?