import Foundation final class RDEPUBMetadataParseCancellationController { let token: UUID private let lock = NSLock() private weak var queue: OperationQueue? private var cancelled = false init(token: UUID) { self.token = token } func attach(queue: OperationQueue) { let shouldCancelImmediately: Bool lock.lock() self.queue = queue shouldCancelImmediately = cancelled lock.unlock() if shouldCancelImmediately { queue.cancelAllOperations() } } func cancel() { let queueToCancel: OperationQueue? lock.lock() cancelled = true queueToCancel = queue lock.unlock() queueToCancel?.cancelAllOperations() } var isCancelled: Bool { lock.lock() let value = cancelled lock.unlock() return value } }