summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2022-02-04 11:14:11 +0100
committerAndrej Mihajlov <and@mullvad.net>2022-02-07 14:37:41 +0100
commit0888f63fac9282c311d94bc5fd47f76139c14c81 (patch)
treefb6f984ca978a818661f7ae9b5b62bdab00a0fef
parentf5d812b214240cb119af725bcfc3e81d05cd1cc5 (diff)
downloadmullvadvpn-0888f63fac9282c311d94bc5fd47f76139c14c81.tar.xz
mullvadvpn-0888f63fac9282c311d94bc5fd47f76139c14c81.zip
AsyncBlockOperation: add cancellation handler
-rw-r--r--ios/MullvadVPN/Operations/AsyncBlockOperation.swift35
1 files changed, 32 insertions, 3 deletions
diff --git a/ios/MullvadVPN/Operations/AsyncBlockOperation.swift b/ios/MullvadVPN/Operations/AsyncBlockOperation.swift
index a26e4e249f..8b368b5551 100644
--- a/ios/MullvadVPN/Operations/AsyncBlockOperation.swift
+++ b/ios/MullvadVPN/Operations/AsyncBlockOperation.swift
@@ -10,13 +10,42 @@ import Foundation
/// Asynchronous block operation
class AsyncBlockOperation: AsyncOperation {
- private let block: ((AsyncBlockOperation) -> Void)
+ private let stateLock = NSLock()
+
+ private var executionBlock: ((AsyncBlockOperation) -> Void)?
+ private var cancellationBlocks: [() -> Void] = []
init(block: @escaping (AsyncBlockOperation) -> Void) {
- self.block = block
+ executionBlock = block
}
override func main() {
- block(self)
+ executionBlock?(self)
+ executionBlock = nil
+ }
+
+ override func cancel() {
+ super.cancel()
+
+ stateLock.lock()
+ let blocks = cancellationBlocks
+ cancellationBlocks.removeAll()
+ stateLock.unlock()
+
+ for block in blocks {
+ block()
+ }
+ }
+
+ func addCancellationBlock(_ block: @escaping () -> Void) {
+ stateLock.lock()
+
+ if isCancelled {
+ stateLock.unlock()
+ block()
+ } else {
+ cancellationBlocks.append(block)
+ stateLock.unlock()
+ }
}
}