diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2022-03-14 10:55:53 +0100 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2022-03-14 10:55:53 +0100 |
| commit | 78dc4644a82d7b3fb904ef3cbac8a1f705f0a213 (patch) | |
| tree | 9f8d8eccfa0f02ca59966699e4472bae25ee9898 | |
| parent | ce8940e211201242c29e35fe58b7dcd5013b391b (diff) | |
| parent | a9d92965781cfbe6451ba978ddcd00e6cfe09b1d (diff) | |
| download | mullvadvpn-78dc4644a82d7b3fb904ef3cbac8a1f705f0a213.tar.xz mullvadvpn-78dc4644a82d7b3fb904ef3cbac8a1f705f0a213.zip | |
Merge branch 'weak-observer'
| -rw-r--r-- | ios/MullvadVPN.xcodeproj/project.pbxproj | 12 | ||||
| -rw-r--r-- | ios/MullvadVPN/Account.swift | 35 | ||||
| -rw-r--r-- | ios/MullvadVPN/AppStorePaymentManager/AnyAppStorePaymentObserver.swift | 47 | ||||
| -rw-r--r-- | ios/MullvadVPN/AppStorePaymentManager/AppStorePaymentManager.swift | 10 | ||||
| -rw-r--r-- | ios/MullvadVPN/ObserverList.swift | 82 | ||||
| -rw-r--r-- | ios/MullvadVPN/RelayCache/AnyRelayCacheObserver.swift | 31 | ||||
| -rw-r--r-- | ios/MullvadVPN/RelayCache/RelayCacheTracker.swift | 10 | ||||
| -rw-r--r-- | ios/MullvadVPN/TunnelManager/AnyTunnelObserver.swift | 36 | ||||
| -rw-r--r-- | ios/MullvadVPN/TunnelManager/TunnelManager.swift | 10 |
9 files changed, 78 insertions, 195 deletions
diff --git a/ios/MullvadVPN.xcodeproj/project.pbxproj b/ios/MullvadVPN.xcodeproj/project.pbxproj index 15a2b8d6f3..a7c5dc561c 100644 --- a/ios/MullvadVPN.xcodeproj/project.pbxproj +++ b/ios/MullvadVPN.xcodeproj/project.pbxproj @@ -74,7 +74,6 @@ 5820676426E771DB00655B05 /* TunnelManagerError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5820676326E771DB00655B05 /* TunnelManagerError.swift */; }; 5820676826E79E7B00655B05 /* Result+UIBackgroundFetchResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5820676726E79E7B00655B05 /* Result+UIBackgroundFetchResult.swift */; }; 5823FA5426CE49F700283BF8 /* TunnelObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5823FA5326CE49F600283BF8 /* TunnelObserver.swift */; }; - 5823FA5626CE4A2B00283BF8 /* AnyTunnelObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5823FA5526CE4A2B00283BF8 /* AnyTunnelObserver.swift */; }; 58293FAE2510CA58005D0BB5 /* ProblemReportViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58293FAC2510CA58005D0BB5 /* ProblemReportViewController.swift */; }; 58293FB125124117005D0BB5 /* CustomTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58293FB025124117005D0BB5 /* CustomTextField.swift */; }; 58293FB3251241B4005D0BB5 /* CustomTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58293FB2251241B3005D0BB5 /* CustomTextView.swift */; }; @@ -104,7 +103,6 @@ 5846226A26E0E6FA0035F7C2 /* ReceiptRefreshOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5846226926E0E6FA0035F7C2 /* ReceiptRefreshOperation.swift */; }; 5846227126E229F20035F7C2 /* AppStoreSubscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5846227026E229F20035F7C2 /* AppStoreSubscription.swift */; }; 5846227326E22A160035F7C2 /* AppStorePaymentObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5846227226E22A160035F7C2 /* AppStorePaymentObserver.swift */; }; - 5846227526E22A350035F7C2 /* AnyAppStorePaymentObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5846227426E22A350035F7C2 /* AnyAppStorePaymentObserver.swift */; }; 5846227726E22A7C0035F7C2 /* AppStorePaymentManagerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5846227626E22A7C0035F7C2 /* AppStorePaymentManagerDelegate.swift */; }; 5846227A26E24F1F0035F7C2 /* ExclusivityController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 580EE20524B3222200F9D8A1 /* ExclusivityController.swift */; }; 584789BE264D4A2A000E45FB /* le_root_cert.cer in Resources */ = {isa = PBXBuildFile; fileRef = 584789B7264D4A2A000E45FB /* le_root_cert.cer */; }; @@ -318,7 +316,6 @@ 58FAEE0324533ABE00CB0F5B /* KeychainReturn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58FAEDFE24533A7000CB0F5B /* KeychainReturn.swift */; }; 58FAEE0424533AC000CB0F5B /* KeychainClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58FAEE0024533A9C00CB0F5B /* KeychainClass.swift */; }; 58FB865526E8BF3100F188BC /* AppStorePaymentManagerError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58FB865426E8BF3100F188BC /* AppStorePaymentManagerError.swift */; }; - 58FB865826EA213300F188BC /* AnyRelayCacheObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58FB865726EA213300F188BC /* AnyRelayCacheObserver.swift */; }; 58FB865A26EA214400F188BC /* RelayCacheObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58FB865926EA214400F188BC /* RelayCacheObserver.swift */; }; 58FB865E26EA284E00F188BC /* LogFormatting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58FB865D26EA284E00F188BC /* LogFormatting.swift */; }; 58FB865F26EA2E6D00F188BC /* LogFormatting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58FB865D26EA284E00F188BC /* LogFormatting.swift */; }; @@ -409,7 +406,6 @@ 5820676726E79E7B00655B05 /* Result+UIBackgroundFetchResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Result+UIBackgroundFetchResult.swift"; sourceTree = "<group>"; }; 5823FA4F26CA690600283BF8 /* OSLogHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSLogHandler.swift; sourceTree = "<group>"; }; 5823FA5326CE49F600283BF8 /* TunnelObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelObserver.swift; sourceTree = "<group>"; }; - 5823FA5526CE4A2B00283BF8 /* AnyTunnelObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnyTunnelObserver.swift; sourceTree = "<group>"; }; 58293FAC2510CA58005D0BB5 /* ProblemReportViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProblemReportViewController.swift; sourceTree = "<group>"; }; 58293FB025124117005D0BB5 /* CustomTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTextField.swift; sourceTree = "<group>"; }; 58293FB2251241B3005D0BB5 /* CustomTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTextView.swift; sourceTree = "<group>"; }; @@ -435,7 +431,6 @@ 5846226926E0E6FA0035F7C2 /* ReceiptRefreshOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReceiptRefreshOperation.swift; sourceTree = "<group>"; }; 5846227026E229F20035F7C2 /* AppStoreSubscription.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStoreSubscription.swift; sourceTree = "<group>"; }; 5846227226E22A160035F7C2 /* AppStorePaymentObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStorePaymentObserver.swift; sourceTree = "<group>"; }; - 5846227426E22A350035F7C2 /* AnyAppStorePaymentObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnyAppStorePaymentObserver.swift; sourceTree = "<group>"; }; 5846227626E22A7C0035F7C2 /* AppStorePaymentManagerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStorePaymentManagerDelegate.swift; sourceTree = "<group>"; }; 584789B7264D4A2A000E45FB /* le_root_cert.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = le_root_cert.cer; sourceTree = "<group>"; }; 584789DF26529D72000E45FB /* SSLPinningURLSessionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SSLPinningURLSessionDelegate.swift; sourceTree = "<group>"; }; @@ -603,7 +598,6 @@ 58FAEDFE24533A7000CB0F5B /* KeychainReturn.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainReturn.swift; sourceTree = "<group>"; }; 58FAEE0024533A9C00CB0F5B /* KeychainClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainClass.swift; sourceTree = "<group>"; }; 58FB865426E8BF3100F188BC /* AppStorePaymentManagerError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStorePaymentManagerError.swift; sourceTree = "<group>"; }; - 58FB865726EA213300F188BC /* AnyRelayCacheObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnyRelayCacheObserver.swift; sourceTree = "<group>"; }; 58FB865926EA214400F188BC /* RelayCacheObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayCacheObserver.swift; sourceTree = "<group>"; }; 58FB865D26EA284E00F188BC /* LogFormatting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogFormatting.swift; sourceTree = "<group>"; }; 58FB866026EB677F00F188BC /* TunnelInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelInfo.swift; sourceTree = "<group>"; }; @@ -704,7 +698,6 @@ 5823FA5726CE4A4100283BF8 /* TunnelManager */ = { isa = PBXGroup; children = ( - 5823FA5526CE4A2B00283BF8 /* AnyTunnelObserver.swift */, 587C575226D2615F005EF767 /* PacketTunnelOptions.swift */, 58FB866026EB677F00F188BC /* TunnelInfo.swift */, 5835B7CB233B76CB0096D79F /* TunnelManager.swift */, @@ -756,7 +749,6 @@ 5846226F26E229CD0035F7C2 /* AppStorePaymentManager */ = { isa = PBXGroup; children = ( - 5846227426E22A350035F7C2 /* AnyAppStorePaymentObserver.swift */, 58DF28A42417CB4B00E836B0 /* AppStorePaymentManager.swift */, 5846227626E22A7C0035F7C2 /* AppStorePaymentManagerDelegate.swift */, 58FB865426E8BF3100F188BC /* AppStorePaymentManagerError.swift */, @@ -769,7 +761,6 @@ 585DA87526B0249A00B8C587 /* RelayCache */ = { isa = PBXGroup; children = ( - 58FB865726EA213300F188BC /* AnyRelayCacheObserver.swift */, 585DA87626B024A600B8C587 /* CachedRelays.swift */, 5820675A26E6576800655B05 /* RelayCache.swift */, 585DA87926B024F900B8C587 /* RelayCacheError.swift */, @@ -1437,7 +1428,6 @@ 58AEEF6B2344A46200C9BBD5 /* TunnelSettingsManager.swift in Sources */, 587CBFE322807F530028DED3 /* UIColor+Helpers.swift in Sources */, 5806767927048E8800C858CB /* Keychain.swift in Sources */, - 5846227526E22A350035F7C2 /* AnyAppStorePaymentObserver.swift in Sources */, 588527B4276B4F2F00BAA373 /* SetAccountOperation.swift in Sources */, 585CA70F25F8C44600B47C62 /* UIMetrics.swift in Sources */, 58095C592762155700890776 /* RESTRetryStrategy.swift in Sources */, @@ -1481,7 +1471,6 @@ 5807E2C02432038B00F5FF30 /* String+Split.swift in Sources */, 58CE5E66224146200008646E /* LoginViewController.swift in Sources */, 58EF580B25D69D7A00AEBA94 /* ProblemReportSubmissionOverlayView.swift in Sources */, - 5823FA5626CE4A2B00283BF8 /* AnyTunnelObserver.swift in Sources */, 58FD5BE724192A2C00112C88 /* AppStoreReceipt.swift in Sources */, 5892A45E265FABFF00890742 /* EmptyTableViewHeaderFooterView.swift in Sources */, 58FB866126EB678000F188BC /* TunnelInfo.swift in Sources */, @@ -1523,7 +1512,6 @@ 587425C12299833500CA2045 /* RootContainerViewController.swift in Sources */, 585DA87726B024A600B8C587 /* CachedRelays.swift in Sources */, 585DA89B26B146B300B8C587 /* TunnelIPCCoding.swift in Sources */, - 58FB865826EA213300F188BC /* AnyRelayCacheObserver.swift in Sources */, 5896AE84246D5889005B36CB /* CustomDateComponentsFormatting.swift in Sources */, 585DA89626B0328000B8C587 /* TunnelIPCResponse.swift in Sources */, 587AD7C623421D7000E93A53 /* TunnelSettings.swift in Sources */, diff --git a/ios/MullvadVPN/Account.swift b/ios/MullvadVPN/Account.swift index 54c5f06c0b..a9bcd75323 100644 --- a/ios/MullvadVPN/Account.swift +++ b/ios/MullvadVPN/Account.swift @@ -23,31 +23,6 @@ protocol AccountObserver: AnyObject { func accountDidLogout(_ account: Account) } -/// A type-erasing weak container for `AccountObserver` -private class AnyAccountObserver: AccountObserver, WeakObserverBox, Equatable { - private(set) weak var inner: AccountObserver? - - init<T: AccountObserver>(_ inner: T) { - self.inner = inner - } - - func account(_ account: Account, didUpdateExpiry expiry: Date) { - inner?.account(account, didUpdateExpiry: expiry) - } - - func account(_ account: Account, didLoginWithToken token: String, expiry: Date) { - inner?.account(account, didLoginWithToken: token, expiry: expiry) - } - - func accountDidLogout(_ account: Account) { - inner?.accountDidLogout(account) - } - - static func == (lhs: AnyAccountObserver, rhs: AnyAccountObserver) -> Bool { - return lhs.inner === rhs.inner - } -} - /// A class that groups the account related operations class Account { @@ -77,7 +52,7 @@ class Account { static let shared = Account() private let logger = Logger(label: "Account") - private var observerList = ObserverList<AnyAccountObserver>() + private var observerList = ObserverList<AccountObserver>() /// Returns true if user agreed to terms of service, otherwise false var isAgreedToTermsOfService: Bool { @@ -246,12 +221,12 @@ class Account { // MARK: - Account observation - func addObserver<T: AccountObserver>(_ observer: T) { - observerList.append(AnyAccountObserver(observer)) + func addObserver(_ observer: AccountObserver) { + observerList.append(observer) } - func removeObserver<T: AccountObserver>(_ observer: T) { - observerList.remove(AnyAccountObserver(observer)) + func removeObserver(_ observer: AccountObserver) { + observerList.remove(observer) } } diff --git a/ios/MullvadVPN/AppStorePaymentManager/AnyAppStorePaymentObserver.swift b/ios/MullvadVPN/AppStorePaymentManager/AnyAppStorePaymentObserver.swift deleted file mode 100644 index 0115d57949..0000000000 --- a/ios/MullvadVPN/AppStorePaymentManager/AnyAppStorePaymentObserver.swift +++ /dev/null @@ -1,47 +0,0 @@ -// -// AnyAppStorePaymentObserver.swift -// AnyAppStorePaymentObserver -// -// Created by pronebird on 03/09/2021. -// Copyright © 2021 Mullvad VPN AB. All rights reserved. -// - -import Foundation -import StoreKit - -/// A type-erasing weak container for `AppStorePaymentObserver` -class AnyAppStorePaymentObserver: AppStorePaymentObserver, WeakObserverBox, Equatable { - private(set) weak var inner: AppStorePaymentObserver? - - init<T: AppStorePaymentObserver>(_ inner: T) { - self.inner = inner - } - - func appStorePaymentManager(_ manager: AppStorePaymentManager, - transaction: SKPaymentTransaction, - accountToken: String?, - didFailWithError error: AppStorePaymentManager.Error) - { - self.inner?.appStorePaymentManager( - manager, - transaction: transaction, - accountToken: accountToken, - didFailWithError: error) - } - - func appStorePaymentManager(_ manager: AppStorePaymentManager, - transaction: SKPaymentTransaction, - accountToken: String, - didFinishWithResponse response: REST.CreateApplePaymentResponse) - { - self.inner?.appStorePaymentManager( - manager, - transaction: transaction, - accountToken: accountToken, - didFinishWithResponse: response) - } - - static func == (lhs: AnyAppStorePaymentObserver, rhs: AnyAppStorePaymentObserver) -> Bool { - return lhs.inner === rhs.inner - } -} diff --git a/ios/MullvadVPN/AppStorePaymentManager/AppStorePaymentManager.swift b/ios/MullvadVPN/AppStorePaymentManager/AppStorePaymentManager.swift index 6886de4c7d..e40ba834fe 100644 --- a/ios/MullvadVPN/AppStorePaymentManager/AppStorePaymentManager.swift +++ b/ios/MullvadVPN/AppStorePaymentManager/AppStorePaymentManager.swift @@ -29,7 +29,7 @@ class AppStorePaymentManager: NSObject, SKPaymentTransactionObserver { }() private let paymentQueue: SKPaymentQueue - private var observerList = ObserverList<AnyAppStorePaymentObserver>() + private var observerList = ObserverList<AppStorePaymentObserver>() private weak var classDelegate: AppStorePaymentManagerDelegate? weak var delegate: AppStorePaymentManagerDelegate? { @@ -85,12 +85,12 @@ class AppStorePaymentManager: NSObject, SKPaymentTransactionObserver { // MARK: - Payment observation - func addPaymentObserver<T: AppStorePaymentObserver>(_ observer: T) { - observerList.append(AnyAppStorePaymentObserver(observer)) + func addPaymentObserver(_ observer: AppStorePaymentObserver) { + observerList.append(observer) } - func removePaymentObserver<T: AppStorePaymentObserver>(_ observer: T) { - observerList.remove(AnyAppStorePaymentObserver(observer)) + func removePaymentObserver(_ observer: AppStorePaymentObserver) { + observerList.remove(observer) } // MARK: - Products and payments diff --git a/ios/MullvadVPN/ObserverList.swift b/ios/MullvadVPN/ObserverList.swift index efc7fa3f1c..b936ae3bdf 100644 --- a/ios/MullvadVPN/ObserverList.swift +++ b/ios/MullvadVPN/ObserverList.swift @@ -8,46 +8,80 @@ import Foundation -protocol WeakObserverBox: Equatable { - associatedtype Wrapped +struct WeakBox<T> { + var value: T? { + return valueProvider() + } + + private let valueProvider: (() -> T?) + + init(_ value: T) { + let reference = value as AnyObject + + valueProvider = { [weak reference] in + return reference as? T + } + } - var inner: Wrapped? { get } + static func == (lhs: WeakBox<T>, rhs: T) -> Bool { + return (lhs.value as AnyObject) === (rhs as AnyObject) + } } -class ObserverList<T: WeakObserverBox> { - private let lock = NSRecursiveLock() - private var observers = [T]() +final class ObserverList<T> { + private let lock = NSLock() + private var observers = [WeakBox<T>]() func append(_ observer: T) { - lock.withCriticalBlock { - if !self.observers.contains(observer) { - self.observers.append(observer) - } + lock.lock() + + let hasObserver = observers.contains { box in + return box == observer + } + + if !hasObserver { + observers.append(WeakBox(observer)) } + + lock.unlock() } func remove(_ observer: T) { - lock.withCriticalBlock { - self.observers.removeAll { $0 == observer } + lock.lock() + + let index = observers.firstIndex { box in + return box == observer + } + + if let index = index { + observers.remove(at: index) } + + lock.unlock() } func forEach(_ body: (T) -> Void) { - lock.withCriticalBlock { - var discardObservers = [T]() - self.observers.forEach { (boxedObserver) in - body(boxedObserver) + lock.lock() - if boxedObserver.inner == nil { - discardObservers.append(boxedObserver) - } - } + var indicesToRemove = [Int]() + var observersToNotify = [T]() - if !discardObservers.isEmpty { - self.observers.removeAll { (observer) -> Bool in - return discardObservers.contains(observer) - } + for (index, box) in observers.enumerated() { + if let observer = box.value { + observersToNotify.append(observer) + } else { + indicesToRemove.append(index) } } + + for index in indicesToRemove.reversed() { + observers.remove(at: index) + } + + lock.unlock() + + for observer in observersToNotify { + body(observer) + } } } diff --git a/ios/MullvadVPN/RelayCache/AnyRelayCacheObserver.swift b/ios/MullvadVPN/RelayCache/AnyRelayCacheObserver.swift deleted file mode 100644 index b588530311..0000000000 --- a/ios/MullvadVPN/RelayCache/AnyRelayCacheObserver.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// AnyRelayCacheObserver.swift -// AnyRelayCacheObserver -// -// Created by pronebird on 09/09/2021. -// Copyright © 2021 Mullvad VPN AB. All rights reserved. -// - -import Foundation - -extension RelayCache { - - final class AnyRelayCacheObserver: WeakObserverBox, RelayCacheObserver { - typealias Wrapped = RelayCacheObserver - - private(set) weak var inner: RelayCacheObserver? - - init<T: RelayCacheObserver>(_ inner: T) { - self.inner = inner - } - - func relayCache(_ relayCache: RelayCache.Tracker, didUpdateCachedRelays cachedRelays: CachedRelays) { - inner?.relayCache(relayCache, didUpdateCachedRelays: cachedRelays) - } - - static func == (lhs: AnyRelayCacheObserver, rhs: AnyRelayCacheObserver) -> Bool { - return lhs.inner === rhs.inner - } - } - -} diff --git a/ios/MullvadVPN/RelayCache/RelayCacheTracker.swift b/ios/MullvadVPN/RelayCache/RelayCacheTracker.swift index d97b958d85..a42d8245df 100644 --- a/ios/MullvadVPN/RelayCache/RelayCacheTracker.swift +++ b/ios/MullvadVPN/RelayCache/RelayCacheTracker.swift @@ -38,7 +38,7 @@ extension RelayCache { private var isPeriodicUpdatesEnabled = false /// Observers - private let observerList = ObserverList<AnyRelayCacheObserver>() + private let observerList = ObserverList<RelayCacheObserver>() /// A shared instance of `RelayCache` static let shared: RelayCache.Tracker = { @@ -144,12 +144,12 @@ extension RelayCache { // MARK: - Observation - func addObserver<T: RelayCacheObserver>(_ observer: T) { - observerList.append(AnyRelayCacheObserver(observer)) + func addObserver(_ observer: RelayCacheObserver) { + observerList.append(observer) } - func removeObserver<T: RelayCacheObserver>(_ observer: T) { - observerList.remove(AnyRelayCacheObserver(observer)) + func removeObserver(_ observer: RelayCacheObserver) { + observerList.remove(observer) } // MARK: - Private instance methods diff --git a/ios/MullvadVPN/TunnelManager/AnyTunnelObserver.swift b/ios/MullvadVPN/TunnelManager/AnyTunnelObserver.swift deleted file mode 100644 index 313d190714..0000000000 --- a/ios/MullvadVPN/TunnelManager/AnyTunnelObserver.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// AnyTunnelObserver.swift -// AnyTunnelObserver -// -// Created by pronebird on 19/08/2021. -// Copyright © 2021 Mullvad VPN AB. All rights reserved. -// - -import Foundation - -class AnyTunnelObserver: WeakObserverBox, TunnelObserver { - - typealias Wrapped = TunnelObserver - - private(set) weak var inner: TunnelObserver? - - init<T: TunnelObserver>(_ observer: T) { - inner = observer - } - - func tunnelManager(_ manager: TunnelManager, didUpdateTunnelState tunnelState: TunnelState) { - inner?.tunnelManager(manager, didUpdateTunnelState: tunnelState) - } - - func tunnelManager(_ manager: TunnelManager, didUpdateTunnelSettings tunnelInfo: TunnelInfo?) { - inner?.tunnelManager(manager, didUpdateTunnelSettings: tunnelInfo) - } - - func tunnelManager(_ manager: TunnelManager, didFailWithError error: TunnelManager.Error) { - inner?.tunnelManager(manager, didFailWithError: error) - } - - static func == (lhs: AnyTunnelObserver, rhs: AnyTunnelObserver) -> Bool { - return lhs.inner === rhs.inner - } -} diff --git a/ios/MullvadVPN/TunnelManager/TunnelManager.swift b/ios/MullvadVPN/TunnelManager/TunnelManager.swift index a885bf56d4..9fa6de52d7 100644 --- a/ios/MullvadVPN/TunnelManager/TunnelManager.swift +++ b/ios/MullvadVPN/TunnelManager/TunnelManager.swift @@ -44,7 +44,7 @@ class TunnelManager: TunnelManagerStateDelegate private let exclusivityController = ExclusivityController() private var lastMapConnectionStatusOperation: Operation? - private let observerList = ObserverList<AnyTunnelObserver>() + private let observerList = ObserverList<TunnelObserver>() private let state: TunnelManager.State @@ -430,13 +430,13 @@ class TunnelManager: TunnelManagerStateDelegate /// Add tunnel observer. /// In order to cancel the observation, either call `removeObserver(_:)` or simply release /// the observer. - func addObserver<T: TunnelObserver>(_ observer: T) { - observerList.append(AnyTunnelObserver(observer)) + func addObserver(_ observer: TunnelObserver) { + observerList.append(observer) } /// Remove tunnel observer. - func removeObserver<T: TunnelObserver>(_ observer: T) { - observerList.remove(AnyTunnelObserver(observer)) + func removeObserver(_ observer: TunnelObserver) { + observerList.remove(observer) } // MARK: - TunnelManagerStateDelegate |
