diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2021-09-14 11:02:28 +0200 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2021-09-15 10:58:43 +0200 |
| commit | 1cfcf0ea19cfd01aea0b59cae10bc46ecb9dab95 (patch) | |
| tree | e0483645540e3aa8c0172c685b9d0adac8253808 /ios | |
| parent | 24b7214a9261c0f841ec47757fc26035a1126048 (diff) | |
| download | mullvadvpn-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.swift | 19 |
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 |
