Я прочитал много статей о фоновых потоках в iOS. Некоторые пытаются использовать операции, а некоторые просто используют базовые быстрые объекты. Проверим оба подхода.

Давайте начнем с основ. Документация Apple прямолинейна в этом вопросе.

Шаг 1. Включите фоновый режим выборки и/или обработки на вкладке подписи и возможностей целевого объекта.

Шаг второй. Добавьте разрешенный идентификатор в файл Info.plist.

<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>your.refresh.identifier</string>
</array>

Шаг 3.Зарегистрируйте планировщик

static let backgroundRefreshIdentifier = "your.refresh.identifier"
func setupScheduler() {
  BGTaskScheduler.shared.register(forTaskWithIdentifier: AppDelegate.backgroundRefreshIdentifier, using: nil) { task in
     self.handleAppRefreshTask(task: task as? BGAppRefreshTask)
  }
}

А теперь мы воспользуемся двумя разными подходами.

Шаг четвертый. Обработка обновления

Сначала подход operation:

func handleAppRefresh(task: BGAppRefreshTask?) {
  scheduleAppRefresh()
  let queue = OperationQueue()
  queue.maxConcurrentOperationCount = 1
  // myOperation is a subclass of Operation
  let myOperation = MyOperation()
  task?.expirationHandler = {
    queue.cancelAllOperations()
  }
  task?.setTaskCompleted(success: !(operations.last?.isCancelled ?? false))
  let operations = [operation]
  queue.addOperations(operations, waitUntilFinished: false)
}

Вы должны создавать операции и добавлять их в очередь. Просто добавьте столько, сколько хотите, в массив операций. Если операция зависит от другой, вам необходимо добавить такие зависимости, как:

myOperation2.addDependency(myOperation)

Так что, глядя на это, подход усложняется. Особенно, если ваши операции асинхронны. Вы должны создать подкласс класса Operation, просто назовите его AsyncOperation и перезапишите следующее:

var isAsynchronous: Bool
var isExecuting: Bool
var isFinished: Bool
func start()
func main()

Но это становится сложным.

Итак, давайте воспользуемся другим подходом:

let refreshManager = RefreshManager()
func handleAppRefreshTask(task: BGAppRefreshTask?) {
  scheduleAppRefresh()
  task?.expirationHandler = {
    task?.setTaskCompleted(success: false)
    //Kill everything you have created to play by the rules
  }
  refreshManager.doSomething(completionHandler: { isCompleted in
    task?.setTaskCompleted(success: isCompleted)
  })
}

Итак, здесь у вас есть асинхронный вызов без необходимости реализации и создания асинхронных операций. Вам не нужно создавать очередь и добавлять туда свои операции, и в конце результат будет таким же. Платформа Apple творит чудеса, и вы можете обновлять приложение в фоновом режиме или выполнять задачи обработки.

Шаг пятый. Запланируйте задачу

Не забудьте запланировать свою задачу, чтобы ваше приложение часто обновлялось.

func scheduleAppRefresh() {
  let fetchTask = BGAppRefreshTaskRequest(identifier: backgroundRefreshIdentifier)
  fetchTask.earliestBeginDate = Date(timeIntervalSinceNow: 60 * 30)
  do {
    try BGTaskScheduler.shared.submit(fetchTask)
  } catch {
    print("Unable to submit task: \(error.localizedDescription)")
  }
}

Это все, что нужно знать о фоновом обновлении и задачах обработки во вселенной iOS.

Оставляйте любые комментарии ниже :)