diff options
| -rw-r--r-- | ios/MullvadVPN/Account.swift | 60 | ||||
| -rw-r--r-- | ios/MullvadVPN/Operations/OperationBlockObserver.swift | 29 | ||||
| -rw-r--r-- | ios/MullvadVPN/Operations/OutputOperation.swift | 4 | ||||
| -rw-r--r-- | ios/MullvadVPN/TunnelManager.swift | 18 | ||||
| -rw-r--r-- | ios/PacketTunnel/PacketTunnelProvider.swift | 6 |
5 files changed, 60 insertions, 57 deletions
diff --git a/ios/MullvadVPN/Account.swift b/ios/MullvadVPN/Account.swift index eaf9b954c1..2dee095be1 100644 --- a/ios/MullvadVPN/Account.swift +++ b/ios/MullvadVPN/Account.swift @@ -90,19 +90,17 @@ class Account { func loginWithNewAccount(completionHandler: @escaping (Result<AccountResponse, Error>) -> Void) { let operation = rest.createAccount().operation(payload: EmptyPayload()) - operation.addDidFinishBlockObserver({ (operation, result) in - DispatchQueue.main.async { - switch result { - case .success(let response): - self.setupTunnel(accountToken: response.token, expiry: response.expires) { (result) in - completionHandler(result.map { response }) - } - - case .failure(let error): - completionHandler(.failure(.createAccount(error))) + operation.addDidFinishBlockObserver(queue: .main) { (operation, result) in + switch result { + case .success(let response): + self.setupTunnel(accountToken: response.token, expiry: response.expires) { (result) in + completionHandler(result.map { response }) } + + case .failure(let error): + completionHandler(.failure(.createAccount(error))) } - }) + } exclusivityController.addOperation(operation, categories: [.exclusive]) } @@ -113,17 +111,15 @@ class Account { let operation = rest.getAccountExpiry() .operation(payload: .init(token: accountToken, payload: EmptyPayload())) - operation.addDidFinishBlockObserver { (operation, result) in - DispatchQueue.main.async { - switch result { - case .success(let response): - self.setupTunnel(accountToken: response.token, expiry: response.expires) { (result) in - completionHandler(result.map { response }) - } - - case .failure(let error): - completionHandler(.failure(.verifyAccount(error))) + operation.addDidFinishBlockObserver(queue: .main) { (operation, result) in + switch result { + case .success(let response): + self.setupTunnel(accountToken: response.token, expiry: response.expires) { (result) in + completionHandler(result.map { response }) } + + case .failure(let error): + completionHandler(.failure(.verifyAccount(error))) } } @@ -148,10 +144,8 @@ class Account { } } - operation.addDidFinishBlockObserver { (operation, result) in - DispatchQueue.main.async { - completionHandler(result) - } + operation.addDidFinishBlockObserver(queue: .main) { (operation, result) in + completionHandler(result) } exclusivityController.addOperation(operation, categories: [.exclusive]) @@ -168,16 +162,14 @@ class Account { .operation(payload: nil) .injectResult(from: makeRequest) - sendRequest.addDidFinishBlockObserver { (operation, result) in - DispatchQueue.main.async { - switch result { - case .success(let response): - self.expiry = response.expires - self.postExpiryUpdateNotification(newExpiry: response.expires) + sendRequest.addDidFinishBlockObserver(queue: .main) { (operation, result) in + switch result { + case .success(let response): + self.expiry = response.expires + self.postExpiryUpdateNotification(newExpiry: response.expires) - case .failure(let error): - error.logChain(message: "Failed to update account expiry") - } + case .failure(let error): + error.logChain(message: "Failed to update account expiry") } } diff --git a/ios/MullvadVPN/Operations/OperationBlockObserver.swift b/ios/MullvadVPN/Operations/OperationBlockObserver.swift index 728e9a5a02..eccb7f63ab 100644 --- a/ios/MullvadVPN/Operations/OperationBlockObserver.swift +++ b/ios/MullvadVPN/Operations/OperationBlockObserver.swift @@ -12,22 +12,41 @@ class OperationBlockObserver<OperationType: OperationProtocol>: OperationObserve private var willFinish: ((OperationType) -> Void)? private var didFinish: ((OperationType) -> Void)? - init(willFinish: ((OperationType) -> Void)? = nil, didFinish: ((OperationType) -> Void)? = nil) { + let queue: DispatchQueue? + + init(queue: DispatchQueue? = nil, willFinish: ((OperationType) -> Void)? = nil, didFinish: ((OperationType) -> Void)? = nil) { + self.queue = queue self.willFinish = willFinish self.didFinish = didFinish } func operationWillFinish(_ operation: OperationType) { - self.willFinish?(operation) + if let willFinish = self.willFinish { + scheduleEvent { + willFinish(operation) + } + } } func operationDidFinish(_ operation: OperationType) { - self.didFinish?(operation) + if let didFinish = self.didFinish { + scheduleEvent { + didFinish(operation) + } + } + } + + private func scheduleEvent(_ body: @escaping () -> Void) { + if let queue = queue { + queue.async(execute: body) + } else { + body() + } } } extension OperationProtocol { - func addDidFinishBlockObserver(_ block: @escaping (Self) -> Void) { - addObserver(OperationBlockObserver(didFinish: block)) + func addDidFinishBlockObserver(queue: DispatchQueue? = nil, _ block: @escaping (Self) -> Void) { + addObserver(OperationBlockObserver(queue: queue, didFinish: block)) } } diff --git a/ios/MullvadVPN/Operations/OutputOperation.swift b/ios/MullvadVPN/Operations/OutputOperation.swift index 533d5e5151..064d54a2e9 100644 --- a/ios/MullvadVPN/Operations/OutputOperation.swift +++ b/ios/MullvadVPN/Operations/OutputOperation.swift @@ -40,8 +40,8 @@ extension OutputOperation where Self: OperationSubclassing { } extension OperationProtocol where Self: OutputOperation { - func addDidFinishBlockObserver(_ block: @escaping (Self, Output) -> Void) { - addDidFinishBlockObserver { (operation) in + func addDidFinishBlockObserver(queue: DispatchQueue? = nil, _ block: @escaping (Self, Output) -> Void) { + addDidFinishBlockObserver(queue: queue) { (operation) in if let output = operation.output { block(operation, output) } diff --git a/ios/MullvadVPN/TunnelManager.swift b/ios/MullvadVPN/TunnelManager.swift index 7611b7cbb6..ec234a348f 100644 --- a/ios/MullvadVPN/TunnelManager.swift +++ b/ios/MullvadVPN/TunnelManager.swift @@ -803,7 +803,7 @@ class TunnelManager { let payload = TokenPayload(token: accountToken, payload: PushWireguardKeyRequest(pubkey: publicKey.rawRepresentation)) let operation = rest.pushWireguardKey().operation(payload: payload) - operation.addDidFinishBlockObserver { (operation, result) in + operation.addDidFinishBlockObserver(queue: dispatchQueue) { (operation, result) in let updateResult = result .mapError({ (restError) -> Error in return .pushWireguardKey(restError) @@ -817,9 +817,7 @@ class TunnelManager { }.map { _ in () } } - self.dispatchQueue.async { - completionHandler(updateResult) - } + completionHandler(updateResult) } operationQueue.addOperation(operation) @@ -829,7 +827,7 @@ class TunnelManager { let payload = PublicKeyPayload(pubKey: publicKey, payload: TokenPayload(token: accountToken, payload: EmptyPayload())) let operation = rest.deleteWireguardKey().operation(payload: payload) - operation.addDidFinishBlockObserver { (operation, result) in + operation.addDidFinishBlockObserver(queue: dispatchQueue) { (operation, result) in let result = result.map({ () -> Bool in return true }).flatMapError { (restError) -> Result<Bool, Error> in @@ -840,9 +838,7 @@ class TunnelManager { } } - self.dispatchQueue.async { - completionHandler(result) - } + completionHandler(result) } operationQueue.addOperation(operation) @@ -864,7 +860,7 @@ class TunnelManager { let operation = rest.replaceWireguardKey().operation(payload: payload) - operation.addDidFinishBlockObserver { (operation, result) in + operation.addDidFinishBlockObserver(queue: dispatchQueue) { (operation, result) in let updateResult = result .mapError({ (restError) -> Error in return .replaceWireguardKey(restError) @@ -879,9 +875,7 @@ class TunnelManager { }.map { _ in () } } - self.dispatchQueue.async { - completionHandler(updateResult) - } + completionHandler(updateResult) } operationQueue.addOperation(operation) diff --git a/ios/PacketTunnel/PacketTunnelProvider.swift b/ios/PacketTunnel/PacketTunnelProvider.swift index 6feaacc53c..0e71c6aa14 100644 --- a/ios/PacketTunnel/PacketTunnelProvider.swift +++ b/ios/PacketTunnel/PacketTunnelProvider.swift @@ -419,10 +419,8 @@ class PacketTunnelProvider: NEPacketTunnelProvider { } } - operation.addDidFinishBlockObserver { (operation, result) in - self.dispatchQueue.async { - completionHandler(result) - } + operation.addDidFinishBlockObserver(queue: dispatchQueue) { (operation, result) in + completionHandler(result) } exclusivityController.addOperation(operation, categories: [.exclusive]) |
