Порядок выполнения фоновых задач в swift - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь сохранить некоторые данные локально, а затем загрузить их в серверную часть, когда приложение переходит в фоновый режим.

При локальной записи данных я запускаю некоторые фоновые задачи, чтобы их нельзя было прервать, введя фон.

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» завершен первым?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...