summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--ios/MullvadVPN/Account.swift60
-rw-r--r--ios/MullvadVPN/Operations/OperationBlockObserver.swift29
-rw-r--r--ios/MullvadVPN/Operations/OutputOperation.swift4
-rw-r--r--ios/MullvadVPN/TunnelManager.swift18
-rw-r--r--ios/PacketTunnel/PacketTunnelProvider.swift6
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])