diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2022-02-04 11:14:11 +0100 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2022-02-07 14:37:41 +0100 |
| commit | 0888f63fac9282c311d94bc5fd47f76139c14c81 (patch) | |
| tree | fb6f984ca978a818661f7ae9b5b62bdab00a0fef | |
| parent | f5d812b214240cb119af725bcfc3e81d05cd1cc5 (diff) | |
| download | mullvadvpn-0888f63fac9282c311d94bc5fd47f76139c14c81.tar.xz mullvadvpn-0888f63fac9282c311d94bc5fd47f76139c14c81.zip | |
AsyncBlockOperation: add cancellation handler
| -rw-r--r-- | ios/MullvadVPN/Operations/AsyncBlockOperation.swift | 35 |
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() + } } } |
