Я прочитал много статей о фоновых потоках в 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.
Оставляйте любые комментарии ниже :)