diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2022-06-08 12:04:07 +0200 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2022-06-08 12:31:16 +0200 |
| commit | 0302e8fa731ba27d6121a9409b4f4fa75b201665 (patch) | |
| tree | 5633bb57c6da98825aeb2ffd9fa10d18c8352347 | |
| parent | 2c8cb8005d1ff97bccdc08f9e3be7657629b205c (diff) | |
| download | mullvadvpn-0302e8fa731ba27d6121a9409b4f4fa75b201665.tar.xz mullvadvpn-0302e8fa731ba27d6121a9409b4f4fa75b201665.zip | |
Add convenience initializers for block based operations
| -rw-r--r-- | ios/MullvadVPN/Operations/AsyncBlockOperation.swift | 34 | ||||
| -rw-r--r-- | ios/MullvadVPN/Operations/ResultBlockOperation.swift | 30 |
2 files changed, 61 insertions, 3 deletions
diff --git a/ios/MullvadVPN/Operations/AsyncBlockOperation.swift b/ios/MullvadVPN/Operations/AsyncBlockOperation.swift index a0096f77d6..9c4101fdff 100644 --- a/ios/MullvadVPN/Operations/AsyncBlockOperation.swift +++ b/ios/MullvadVPN/Operations/AsyncBlockOperation.swift @@ -13,16 +13,32 @@ class AsyncBlockOperation: AsyncOperation { private var executionBlock: ((AsyncBlockOperation) -> Void)? private var cancellationBlocks: [() -> Void] = [] - init(dispatchQueue: DispatchQueue?, block: @escaping (AsyncBlockOperation) -> Void) { + override init(dispatchQueue: DispatchQueue? = nil) { + super.init(dispatchQueue: dispatchQueue) + } + + init(dispatchQueue: DispatchQueue? = nil, block: @escaping (AsyncBlockOperation) -> Void) { executionBlock = block super.init(dispatchQueue: dispatchQueue) } + init(dispatchQueue: DispatchQueue? = nil, block: @escaping () -> Void) { + executionBlock = { operation in + block() + operation.finish() + } + super.init(dispatchQueue: dispatchQueue) + } + override func main() { let block = executionBlock executionBlock = nil - block?(self) + if let block = block { + block(self) + } else { + finish() + } } override func operationDidCancel() { @@ -39,6 +55,20 @@ class AsyncBlockOperation: AsyncOperation { executionBlock = nil } + func setExecutionBlock(_ block: @escaping (AsyncBlockOperation) -> Void) { + dispatchQueue.async { + assert(!self.isExecuting && !self.isFinished) + self.executionBlock = block + } + } + + func setExecutionBlock(_ block: @escaping () -> Void) { + setExecutionBlock { operation in + block() + operation.finish() + } + } + func addCancellationBlock(_ block: @escaping () -> Void) { dispatchQueue.async { if self.isCancelled { diff --git a/ios/MullvadVPN/Operations/ResultBlockOperation.swift b/ios/MullvadVPN/Operations/ResultBlockOperation.swift index 4ac88695b5..41e1e8ee77 100644 --- a/ios/MullvadVPN/Operations/ResultBlockOperation.swift +++ b/ios/MullvadVPN/Operations/ResultBlockOperation.swift @@ -10,11 +10,16 @@ import Foundation class ResultBlockOperation<Success, Failure: Error>: ResultOperation<Success, Failure> { typealias ExecutionBlock = (ResultBlockOperation<Success, Failure>) -> Void + typealias ThrowingExecutionBlock = () throws -> Success private var executionBlock: ExecutionBlock? private var cancellationBlocks: [() -> Void] = [] - convenience init(dispatchQueue: DispatchQueue?, executionBlock: @escaping ExecutionBlock) { + convenience init( + dispatchQueue: DispatchQueue? = nil, + executionBlock: @escaping ExecutionBlock + ) + { self.init( dispatchQueue: dispatchQueue, executionBlock: executionBlock, @@ -23,6 +28,29 @@ class ResultBlockOperation<Success, Failure: Error>: ResultOperation<Success, Fa ) } + convenience init( + dispatchQueue: DispatchQueue? = nil, + executionBlock: @escaping ThrowingExecutionBlock + ) + { + self.init( + dispatchQueue: dispatchQueue, + executionBlock: { operation in + do { + let value = try executionBlock() + + operation.finish(completion: .success(value)) + } catch { + let castedError = error as! Failure + + operation.finish(completion: .failure(castedError)) + } + }, + completionQueue: nil, + completionHandler: nil + ) + } + init( dispatchQueue: DispatchQueue?, executionBlock: @escaping ExecutionBlock, |
