summaryrefslogtreecommitdiffhomepage
path: root/ios/MullvadVPN
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2021-09-14 10:57:50 +0200
committerAndrej Mihajlov <and@mullvad.net>2021-09-15 10:58:43 +0200
commitfedea0de95f2a64c3274049ecb9fc32cf902f59f (patch)
treec125714b1dfd2f66e4a49d1255dd60f7c33afbbc /ios/MullvadVPN
parent0637057254b2a9b24d29ce87df3c6f49d16b4cf6 (diff)
downloadmullvadvpn-fedea0de95f2a64c3274049ecb9fc32cf902f59f.tar.xz
mullvadvpn-fedea0de95f2a64c3274049ecb9fc32cf902f59f.zip
Promise: add background task extension
Diffstat (limited to 'ios/MullvadVPN')
-rw-r--r--ios/MullvadVPN/Promise/Promise+BackgroundTask.swift57
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()
+ }
+ }
+ }
+}