summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2022-06-08 12:04:07 +0200
committerAndrej Mihajlov <and@mullvad.net>2022-06-08 12:31:16 +0200
commit0302e8fa731ba27d6121a9409b4f4fa75b201665 (patch)
tree5633bb57c6da98825aeb2ffd9fa10d18c8352347
parent2c8cb8005d1ff97bccdc08f9e3be7657629b205c (diff)
downloadmullvadvpn-0302e8fa731ba27d6121a9409b4f4fa75b201665.tar.xz
mullvadvpn-0302e8fa731ba27d6121a9409b4f4fa75b201665.zip
Add convenience initializers for block based operations
-rw-r--r--ios/MullvadVPN/Operations/AsyncBlockOperation.swift34
-rw-r--r--ios/MullvadVPN/Operations/ResultBlockOperation.swift30
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,