summaryrefslogtreecommitdiffhomepage
path: root/ios/Operations/AsyncBlockOperation.swift
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2023-04-26 17:59:42 +0200
committerAndrej Mihajlov <and@mullvad.net>2023-05-03 16:41:55 +0200
commitfecf172fd12d4e29ed960555cbda24b4981098fc (patch)
tree7a24ab127d16142aa5e44939c638ee0d539a9e8a /ios/Operations/AsyncBlockOperation.swift
parentabd7d6db026a9cdbbd32caa4aed6d3d4da43005d (diff)
downloadmullvadvpn-fecf172fd12d4e29ed960555cbda24b4981098fc.tar.xz
mullvadvpn-fecf172fd12d4e29ed960555cbda24b4981098fc.zip
Operations: add convenience initializer that returns cancellable object
Diffstat (limited to 'ios/Operations/AsyncBlockOperation.swift')
-rw-r--r--ios/Operations/AsyncBlockOperation.swift63
1 files changed, 19 insertions, 44 deletions
diff --git a/ios/Operations/AsyncBlockOperation.swift b/ios/Operations/AsyncBlockOperation.swift
index 43be9b8275..c8889bc9b5 100644
--- a/ios/Operations/AsyncBlockOperation.swift
+++ b/ios/Operations/AsyncBlockOperation.swift
@@ -7,30 +7,34 @@
//
import Foundation
+import protocol MullvadTypes.Cancellable
/// Asynchronous block operation
public class AsyncBlockOperation: AsyncOperation {
- private var executionBlock: ((AsyncBlockOperation) -> Void)?
- private var cancellationBlocks: [() -> Void] = []
+ public typealias ExecutionBlock = (AsyncBlockOperation) -> Void
- override public init(dispatchQueue: DispatchQueue? = nil) {
- super.init(dispatchQueue: dispatchQueue)
- }
+ private var executionBlock: ExecutionBlock?
+ private var cancellableTask: Cancellable?
- public init(
- dispatchQueue: DispatchQueue? = nil,
- block: @escaping (AsyncBlockOperation) -> Void
- ) {
+ public init(dispatchQueue: DispatchQueue? = nil, block: @escaping ExecutionBlock) {
executionBlock = block
super.init(dispatchQueue: dispatchQueue)
}
- public init(dispatchQueue: DispatchQueue? = nil, block: @escaping () -> Void) {
- executionBlock = { operation in
+ public convenience init(dispatchQueue: DispatchQueue? = nil, block: @escaping () -> Void) {
+ self.init(dispatchQueue: dispatchQueue, block: { operation in
block()
operation.finish()
- }
- super.init(dispatchQueue: dispatchQueue)
+ })
+ }
+
+ public convenience init(
+ dispatchQueue: DispatchQueue? = nil,
+ cancellableTask: @escaping (AsyncBlockOperation) -> Cancellable
+ ) {
+ self.init(dispatchQueue: dispatchQueue, block: { operation in
+ operation.cancellableTask = cancellableTask(operation)
+ })
}
override public func main() {
@@ -45,40 +49,11 @@ public class AsyncBlockOperation: AsyncOperation {
}
override public func operationDidCancel() {
- let blocks = cancellationBlocks
- cancellationBlocks.removeAll()
-
- for block in blocks {
- block()
- }
+ cancellableTask?.cancel()
}
override public func operationDidFinish() {
- cancellationBlocks.removeAll()
executionBlock = nil
- }
-
- public func setExecutionBlock(_ block: @escaping (AsyncBlockOperation) -> Void) {
- dispatchQueue.async {
- assert(!self.isExecuting && !self.isFinished)
- self.executionBlock = block
- }
- }
-
- public func setExecutionBlock(_ block: @escaping () -> Void) {
- setExecutionBlock { operation in
- block()
- operation.finish()
- }
- }
-
- public func addCancellationBlock(_ block: @escaping () -> Void) {
- dispatchQueue.async {
- if self.isCancelled, self.isExecuting {
- block()
- } else {
- self.cancellationBlocks.append(block)
- }
- }
+ cancellableTask = nil
}
}