blob: d88e5a5ec73390dec550736d385035dfe13afdaf (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
//
// AsyncBlockOperation.swift
// MullvadVPN
//
// Created by pronebird on 06/07/2020.
// Copyright © 2020 Mullvad VPN AB. All rights reserved.
//
import Foundation
/// Asynchronous block operation
class AsyncBlockOperation: AsyncOperation {
private let stateLock = NSLock()
private var executionBlock: ((AsyncBlockOperation) -> Void)?
private var cancellationBlocks: [() -> Void] = []
init(block: @escaping (AsyncBlockOperation) -> Void) {
executionBlock = block
}
override func main() {
stateLock.lock()
let block = executionBlock
executionBlock = nil
stateLock.unlock()
block?(self)
}
override func finish() {
stateLock.lock()
cancellationBlocks.removeAll()
executionBlock = nil
stateLock.unlock()
super.finish()
}
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()
}
}
}
|