summaryrefslogtreecommitdiffhomepage
path: root/ios
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2021-09-14 11:02:28 +0200
committerAndrej Mihajlov <and@mullvad.net>2021-09-15 10:58:43 +0200
commit1cfcf0ea19cfd01aea0b59cae10bc46ecb9dab95 (patch)
treee0483645540e3aa8c0172c685b9d0adac8253808 /ios
parent24b7214a9261c0f841ec47757fc26035a1126048 (diff)
downloadmullvadvpn-1cfcf0ea19cfd01aea0b59cae10bc46ecb9dab95.tar.xz
mullvadvpn-1cfcf0ea19cfd01aea0b59cae10bc46ecb9dab95.zip
Promise: make call to observe() a call finishing the promise chain
Diffstat (limited to 'ios')
-rw-r--r--ios/MullvadVPN/Promise/Promise.swift19
1 files changed, 9 insertions, 10 deletions
diff --git a/ios/MullvadVPN/Promise/Promise.swift b/ios/MullvadVPN/Promise/Promise.swift
index 91aa4ebdef..d1466e6dc6 100644
--- a/ios/MullvadVPN/Promise/Promise.swift
+++ b/ios/MullvadVPN/Promise/Promise.swift
@@ -45,17 +45,16 @@ final class Promise<Value> {
deinit {
switch state {
- case .resolved, .cancelled:
+ case .resolved, .cancelled, .pending:
break
- case .pending, .executing:
+ case .executing:
preconditionFailure("\(Self.self) is deallocated in \(state) state without being resolved or cancelled.")
}
}
/// Observe the result of Promise.
/// This method starts the promise execution if it hasn't started yet.
- @discardableResult
- func observe(_ receiveCompletion: @escaping (PromiseCompletion<Value>) -> Void) -> Self {
+ func observe(_ receiveCompletion: @escaping (PromiseCompletion<Value>) -> Void) {
return lock.withCriticalBlock {
switch state {
case .resolved(let value, let queue):
@@ -72,7 +71,6 @@ final class Promise<Value> {
case .executing:
observers.append(AnyPromiseObserver<Value>(receiveCompletion))
}
- return self
}
}
@@ -97,10 +95,10 @@ final class Promise<Value> {
/// Trasform the value by producing a promise.
func then<NewValue>(_ onResolve: @escaping (Value) -> Promise<NewValue>) -> Promise<NewValue> {
return Promise<NewValue> { resolver in
- _ = self.observe { completion in
+ self.observe { completion in
switch completion {
case .finished(let value):
- _ = onResolve(value).observe { completion in
+ onResolve(value).observe { completion in
resolver.resolve(completion: completion)
}
case .cancelled:
@@ -113,7 +111,7 @@ final class Promise<Value> {
/// Transform the value.
func then<NewValue>(_ onResolve: @escaping (Value) -> NewValue) -> Promise<NewValue> {
return Promise<NewValue> { resolver in
- _ = self.observe { completion in
+ self.observe { completion in
resolver.resolve(completion: completion.map(onResolve))
}
}
@@ -159,7 +157,7 @@ final class Promise<Value> {
defer { condition.unlock() }
var returnValue: PromiseCompletion<Value>!
- _ = observe { completion in
+ observe { completion in
returnValue = completion
condition.signal()
}
@@ -221,6 +219,7 @@ final class PromiseCancellationToken {
}
struct PromiseResolver<Value> {
+ /// Target promise.
private let promise: Promise<Value>
/// Private initializer.
@@ -257,7 +256,7 @@ struct PromiseResolver<Value> {
/// Set cancellation handler.
func setCancelHandler(_ cancellation: @escaping () -> Void) {
- _ = promise.observe { completion in
+ promise.observe { completion in
switch completion {
case .finished:
break