summaryrefslogtreecommitdiffhomepage
path: root/ios/Operations/OperationObserver.swift
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2022-09-25 16:34:23 +0200
committerAndrej Mihajlov <and@mullvad.net>2022-09-26 16:35:38 +0200
commitf389956c2cd884df142adbf00ff2ac7e2f69c2b2 (patch)
tree5f7d4869324760eb4ba0107c0356edc89efd1457 /ios/Operations/OperationObserver.swift
parent2e83b1ca27ff243a615ff10c94c20840b38dfd45 (diff)
downloadmullvadvpn-f389956c2cd884df142adbf00ff2ac7e2f69c2b2.tar.xz
mullvadvpn-f389956c2cd884df142adbf00ff2ac7e2f69c2b2.zip
Move AsyncOperation into Operations static library and add separate tests
Diffstat (limited to 'ios/Operations/OperationObserver.swift')
-rw-r--r--ios/Operations/OperationObserver.swift63
1 files changed, 63 insertions, 0 deletions
diff --git a/ios/Operations/OperationObserver.swift b/ios/Operations/OperationObserver.swift
new file mode 100644
index 0000000000..db6264d2ba
--- /dev/null
+++ b/ios/Operations/OperationObserver.swift
@@ -0,0 +1,63 @@
+//
+// OperationObserver.swift
+// MullvadVPN
+//
+// Created by pronebird on 30/05/2022.
+// Copyright © 2022 Mullvad VPN AB. All rights reserved.
+//
+
+import Foundation
+
+public protocol OperationObserver {
+ func didAttach(to operation: Operation)
+ func operationDidStart(_ operation: Operation)
+ func operationDidCancel(_ operation: Operation)
+ func operationDidFinish(_ operation: Operation, error: Error?)
+}
+
+/// Block based operation observer.
+public class OperationBlockObserver<OperationType: Operation>: OperationObserver {
+ public typealias VoidBlock = (OperationType) -> Void
+ public typealias FinishBlock = (OperationType, Error?) -> Void
+
+ private let _didAttach: VoidBlock?
+ private let _didStart: VoidBlock?
+ private let _didCancel: VoidBlock?
+ private let _didFinish: FinishBlock?
+
+ public init(
+ didAttach: VoidBlock? = nil,
+ didStart: VoidBlock? = nil,
+ didCancel: VoidBlock? = nil,
+ didFinish: FinishBlock? = nil
+ ) {
+ _didAttach = didAttach
+ _didStart = didStart
+ _didCancel = didCancel
+ _didFinish = didFinish
+ }
+
+ public func didAttach(to operation: Operation) {
+ if let operation = operation as? OperationType {
+ _didAttach?(operation)
+ }
+ }
+
+ public func operationDidStart(_ operation: Operation) {
+ if let operation = operation as? OperationType {
+ _didStart?(operation)
+ }
+ }
+
+ public func operationDidCancel(_ operation: Operation) {
+ if let operation = operation as? OperationType {
+ _didCancel?(operation)
+ }
+ }
+
+ public func operationDidFinish(_ operation: Operation, error: Error?) {
+ if let operation = operation as? OperationType {
+ _didFinish?(operation, error)
+ }
+ }
+}