beginBackgroundTaskWithExpirationHandler избежать многократного вызова и правильного окончания - PullRequest
0 голосов
/ 15 апреля 2020

Я в настоящее время разрабатываю приложение в iOS 13.

Приложение подключается к устройству Bluetooth и обменивается данными с ним. Когда пользователь закрывает соединение с устройством Bluetooth (или отключает Bluetooth или закрывает приложение), мне нужно отслеживать, когда соединение заканчивается, и пару информации. Эти данные необходимо отправить на сервер, поэтому я сохраняю данные в локальной таблице sqlite и затем пытаюсь отправить их, если доступно inte rnet.

Вот проблема: я использую RxSwift, чтобы сделать такой вызов в своем приложении, и я не уверен, как реализовать beginBackgroundTaskWithExpirationHandler, правильно завершив задачу и избегая многократного вызова (чтобы избежать отправки) несколько раз одни и те же данные, я должен убедиться, что выполняется ОДНА задача).

Моя текущая реализация выглядит так:

func SendData() {
    if(backgroundTaskID != .invalid) {
        return
    }

    backgroundTaskID = UIApplication.shared.beginBackgroundTask(withName: TaskIdentifier ) { [weak self] in
            guard let self = self else {
                return
            }

            if(self.backgroundTaskID != .invalid){
                UIApplication.shared.endBackgroundTask(self.backgroundTaskID)
                self.backgroundTaskID = .invalid
            }
        }
//create the observable with the data need to be send

    remoteObservable.subscribe(onNext: {[weak self] (_) in
                guard let self = self else {
                    return
                }
                if(self.backgroundTaskID == .invalid) {
                    return
                }
                UIApplication.shared.endBackgroundTask(self.backgroundTaskID)
            }).disposed(by:disposeBag)
}

Это правильный способ ее реализации?

...