Отменить запланированное событие для фона - PullRequest
0 голосов
/ 06 марта 2020

Итак, у меня есть эта функция, которая должна загружать некоторые данные записи каждые 15 минут в бэкэнд. Это должно произойти, даже если пользователь поместил приложение в фоновом режиме. И поэтому Timer.schedule не работает. Следовательно, я понял, что мне нужно поместить это в код dispatchQueue, показанный ниже:

    while Date(timeIntervalSinceNow: 86400).compare(Date(timeIntervalSinceNow: incrementer)) == .orderedDescending {
            incrementer += 900
            DispatchQueue.main.asyncAfter(deadline: .now() + incrementer, execute: {
                    DispatchQueue.main.async {
                        self.viewModel.upload(data: self.audioRecorder.url, filePath: self.audioRecorder.url)
                        self.audioRecorder.stop()
                        self.fileIncrementer += 1
                        self.startRecording()
                    }
            })
    }

Это, как всегда, вызывает проблему, когда я заранее отменяю задачу, нажимая кнопку остановки и представляя следующее viewController this dispatchQueue просто продолжайте обработку.

Что можно сделать, это добавить:

    if var topController = UIApplication.shared.keyWindowInConnectedScenes?.rootViewController {
                        while let presentedViewController = topController.presentedViewController {
                            topController = presentedViewController
                        }
                        if (topController as? UINavigationController) != self.navigationController {
                            print("cought")
                            return
                        }
    }

Что бы остановить это, если бы я был в другом V C, но если я затем введу новая сессия, у меня будут двойные события. Так как мне сделать это хорошим способом?

1 Ответ

1 голос
/ 08 марта 2020

... когда ... нажатие кнопки остановки ... это dispatchQueue просто продолжить обработку

Да, именно поэтому вы не должны использовать это несколько asyncAfter шаблон. (Кроме того, у вас могут возникнуть проблемы с объединением таймеров.) Timer - правильный способ сделать это.

Так что у меня есть эта функция, которая каждые 15 минут загружает некоторые данные записи. бэкэнд Это должно произойти, даже если пользователь поместил приложение в фоновый режим.

Это проблема. Ни Timer, ни asyncAfter не могут решить эту проблему.

Я предполагаю, что вы пришли к выводу, что вы можете выполнить sh с помощью asyncAfter, но не можете. Возможно, вы тестировали этот процесс во время работы приложения, подключенного к отладчику, который искусственно поддерживает работу приложения в фоновом режиме. Но попробуйте это на устройстве, не подключенном к отладчику, и вы обнаружите, что приложение не продолжает работать, когда пользователь покидает приложение. Этот asyncAfter метод не даст sh того, что вы хотите.

Исключением здесь является то, что ваше приложение запрашивает одну из фоновых возможностей (например, VOIP, musi c, навигация и т. Д. * 1030). *.). Но если приложение предназначено для App Store, Apple довольно старательно отклоняет приложения, которые запрашивают фоновые сервисы для несанкционированных целей. Такая постоянная работа в фоновом режиме убивает батареи за считанные часы, поэтому Apple следит за наилучшими интересами своей пользовательской базы.

Итак, в итоге, если ваше приложение имеет возможность фонового выполнения, Timer это способ сделать этот период c процесс. И если приложение не имеет возможности фонового выполнения, ни Timer, ни какие-либо вызовы GCD не сделают эту работу.

...