diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2023-04-26 17:59:42 +0200 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2023-05-03 16:41:55 +0200 |
| commit | fecf172fd12d4e29ed960555cbda24b4981098fc (patch) | |
| tree | 7a24ab127d16142aa5e44939c638ee0d539a9e8a /ios/Operations/TransformOperation.swift | |
| parent | abd7d6db026a9cdbbd32caa4aed6d3d4da43005d (diff) | |
| download | mullvadvpn-fecf172fd12d4e29ed960555cbda24b4981098fc.tar.xz mullvadvpn-fecf172fd12d4e29ed960555cbda24b4981098fc.zip | |
Operations: add convenience initializer that returns cancellable object
Diffstat (limited to 'ios/Operations/TransformOperation.swift')
| -rw-r--r-- | ios/Operations/TransformOperation.swift | 71 |
1 files changed, 19 insertions, 52 deletions
diff --git a/ios/Operations/TransformOperation.swift b/ios/Operations/TransformOperation.swift index 609e07896c..49361ac641 100644 --- a/ios/Operations/TransformOperation.swift +++ b/ios/Operations/TransformOperation.swift @@ -7,10 +7,10 @@ // import Foundation +import protocol MullvadTypes.Cancellable public final class TransformOperation<Input, Output>: ResultOperation<Output>, InputOperation { public typealias ExecutionBlock = (Input, TransformOperation<Input, Output>) -> Void - public typealias ThrowingExecutionBlock = (Input) throws -> Output public typealias InputBlock = () -> Input? private let nslock = NSLock() @@ -36,28 +36,33 @@ public final class TransformOperation<Input, Output>: ResultOperation<Output>, I private var inputBlock: InputBlock? private var executionBlock: ExecutionBlock? - private var cancellationBlocks: [() -> Void] = [] + private var cancellableTask: Cancellable? - public init( - dispatchQueue: DispatchQueue? = nil, - input: Input? = nil, - block: ExecutionBlock? = nil - ) { + public init(dispatchQueue: DispatchQueue? = nil, input: Input? = nil, block: ExecutionBlock? = nil) { __input = input executionBlock = block super.init(dispatchQueue: dispatchQueue) } - public init( + public convenience init( dispatchQueue: DispatchQueue? = nil, input: Input? = nil, - throwingBlock: @escaping ThrowingExecutionBlock + throwingBlock: @escaping (Input) throws -> Output ) { - __input = input - executionBlock = Self.wrapThrowingBlock(throwingBlock) + self.init(dispatchQueue: dispatchQueue, input: input, block: { input, operation in + operation.finish(result: Result { try throwingBlock(input) }) + }) + } - super.init(dispatchQueue: dispatchQueue) + public convenience init( + dispatchQueue: DispatchQueue? = nil, + input: Input? = nil, + cancellableTask: @escaping (Input, TransformOperation<Input, Output>) -> Cancellable + ) { + self.init(dispatchQueue: dispatchQueue, input: input, block: { input, operation in + operation.cancellableTask = cancellableTask(input, operation) + }) } override public func main() { @@ -74,40 +79,12 @@ public final class TransformOperation<Input, Output>: ResultOperation<Output>, I } override public func operationDidCancel() { - let blocks = cancellationBlocks - cancellationBlocks.removeAll() - - for block in blocks { - block() - } + cancellableTask?.cancel() } override public func operationDidFinish() { - cancellationBlocks.removeAll() executionBlock = nil - } - - // MARK: - Block handlers - - public func setExecutionBlock(_ block: @escaping ExecutionBlock) { - dispatchQueue.async { - assert(!self.isExecuting && !self.isFinished) - self.executionBlock = block - } - } - - public func setExecutionBlock(_ block: @escaping ThrowingExecutionBlock) { - setExecutionBlock(Self.wrapThrowingBlock(block)) - } - - public func addCancellationBlock(_ block: @escaping () -> Void) { - dispatchQueue.async { - if self.isCancelled, self.isExecuting { - block() - } else { - self.cancellationBlocks.append(block) - } - } + cancellableTask = nil } // MARK: - Input injection @@ -117,14 +94,4 @@ public final class TransformOperation<Input, Output>: ResultOperation<Output>, I self.inputBlock = block } } - - private class func wrapThrowingBlock(_ executionBlock: @escaping ThrowingExecutionBlock) - -> ExecutionBlock - { - return { input, operation in - let result = Result { try executionBlock(input) } - - operation.finish(result: result) - } - } } |
