diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2021-09-14 10:57:50 +0200 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2021-09-15 10:58:43 +0200 |
| commit | fedea0de95f2a64c3274049ecb9fc32cf902f59f (patch) | |
| tree | c125714b1dfd2f66e4a49d1255dd60f7c33afbbc /ios/MullvadVPN | |
| parent | 0637057254b2a9b24d29ce87df3c6f49d16b4cf6 (diff) | |
| download | mullvadvpn-fedea0de95f2a64c3274049ecb9fc32cf902f59f.tar.xz mullvadvpn-fedea0de95f2a64c3274049ecb9fc32cf902f59f.zip | |
Promise: add background task extension
Diffstat (limited to 'ios/MullvadVPN')
| -rw-r--r-- | ios/MullvadVPN/Promise/Promise+BackgroundTask.swift | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/ios/MullvadVPN/Promise/Promise+BackgroundTask.swift b/ios/MullvadVPN/Promise/Promise+BackgroundTask.swift new file mode 100644 index 0000000000..1d7bfc3280 --- /dev/null +++ b/ios/MullvadVPN/Promise/Promise+BackgroundTask.swift @@ -0,0 +1,57 @@ +// +// Promise+BackgroundTask.swift +// Promise+BackgroundTask +// +// Created by pronebird on 06/09/2021. +// Copyright © 2021 Mullvad VPN AB. All rights reserved. +// + +import UIKit + +extension Promise { + + /// Start the background task for the duration of the upstream execution. + func requestBackgroundTime(taskName: String? = nil) -> Promise<Value> { + return Promise<Value> { resolver in + var backgroundTaskIdentifier: UIBackgroundTaskIdentifier? + + let beginBackgroundTask = { + backgroundTaskIdentifier = UIApplication.shared.beginBackgroundTask(withName: taskName) { + resolver.resolve(completion: .cancelled) + } + } + + let endBackgroundTask = { + guard let taskIdentifier = backgroundTaskIdentifier, + taskIdentifier != .invalid else { return } + + UIApplication.shared.endBackgroundTask(taskIdentifier) + backgroundTaskIdentifier = nil + } + + let endBackgroundTaskOnMainQueue = { + if Thread.isMainThread { + endBackgroundTask() + } else { + DispatchQueue.main.async(execute: endBackgroundTask) + } + } + + if Thread.isMainThread { + beginBackgroundTask() + } else { + DispatchQueue.main.async(execute: beginBackgroundTask) + } + + resolver.setCancelHandler { + endBackgroundTaskOnMainQueue() + } + + self.observe { completion in + resolver.resolve(completion: completion) + + endBackgroundTaskOnMainQueue() + } + } + } +} |
