summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2022-03-14 10:55:53 +0100
committerAndrej Mihajlov <and@mullvad.net>2022-03-14 10:55:53 +0100
commit78dc4644a82d7b3fb904ef3cbac8a1f705f0a213 (patch)
tree9f8d8eccfa0f02ca59966699e4472bae25ee9898
parentce8940e211201242c29e35fe58b7dcd5013b391b (diff)
parenta9d92965781cfbe6451ba978ddcd00e6cfe09b1d (diff)
downloadmullvadvpn-78dc4644a82d7b3fb904ef3cbac8a1f705f0a213.tar.xz
mullvadvpn-78dc4644a82d7b3fb904ef3cbac8a1f705f0a213.zip
Merge branch 'weak-observer'
-rw-r--r--ios/MullvadVPN.xcodeproj/project.pbxproj12
-rw-r--r--ios/MullvadVPN/Account.swift35
-rw-r--r--ios/MullvadVPN/AppStorePaymentManager/AnyAppStorePaymentObserver.swift47
-rw-r--r--ios/MullvadVPN/AppStorePaymentManager/AppStorePaymentManager.swift10
-rw-r--r--ios/MullvadVPN/ObserverList.swift82
-rw-r--r--ios/MullvadVPN/RelayCache/AnyRelayCacheObserver.swift31
-rw-r--r--ios/MullvadVPN/RelayCache/RelayCacheTracker.swift10
-rw-r--r--ios/MullvadVPN/TunnelManager/AnyTunnelObserver.swift36
-rw-r--r--ios/MullvadVPN/TunnelManager/TunnelManager.swift10
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