快速完成后台任务的完成顺序

时间:2018-11-08 21:24:00

标签: swift background-task dispatch-queue

我正在尝试在本地保存一些数据,然后在应用程序进入后台时将其上传到后端。

在本地写入数据时,我启动了一些后台任务,以使输入背景不会被打断。

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”首先完成?

0 个答案:

没有答案