From 393c5eb770f6d4e1365fb3c6b6ded8e56e662945 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20Ka=C5=A1par=20Jir=C3=A1sek?= Date: Fri, 8 Feb 2019 15:07:05 +0100 Subject: [PATCH 1/2] Use pending promise creation in extension --- .../PromiseKit/APIAdapter+PromiseKit.swift | 32 ++++---- .../URLSessionAPIAdapter+PromiseKit.swift | 74 +++++++++---------- 2 files changed, 50 insertions(+), 56 deletions(-) diff --git a/Extensions/PromiseKit/APIAdapter+PromiseKit.swift b/Extensions/PromiseKit/APIAdapter+PromiseKit.swift index 0b3e8c5..05a2d24 100644 --- a/Extensions/PromiseKit/APIAdapter+PromiseKit.swift +++ b/Extensions/PromiseKit/APIAdapter+PromiseKit.swift @@ -10,28 +10,28 @@ import PromiseKit extension APIAdapter { public func request(response endpoint: Endpoint) -> Promise { - return Promise { resolver in - request(response: endpoint) { result in - switch result { - case .value(let value): - resolver.fulfill(value) - case .error(let error): - resolver.reject(error) - } + let (promise, seal) = Promise.pending() + request(response: endpoint) { result in + switch result { + case .value(let value): + seal.fulfill(value) + case .error(let error): + seal.reject(error) } } + return promise } public func request(data endpoint: APIEndpoint) -> Promise { - return Promise { resolver in - request(data: endpoint) { result in - switch result { - case .value(let value): - resolver.fulfill(value) - case .error(let error): - resolver.reject(error) - } + let (promise, seal) = Promise.pending() + request(data: endpoint) { result in + switch result { + case .value(let value): + seal.fulfill(value) + case .error(let error): + seal.reject(error) } } + return promise } } diff --git a/Extensions/PromiseKit/URLSessionAPIAdapter+PromiseKit.swift b/Extensions/PromiseKit/URLSessionAPIAdapter+PromiseKit.swift index 6508ad4..42a460f 100644 --- a/Extensions/PromiseKit/URLSessionAPIAdapter+PromiseKit.swift +++ b/Extensions/PromiseKit/URLSessionAPIAdapter+PromiseKit.swift @@ -15,51 +15,45 @@ public struct APIDataTask { extension URLSessionAPIAdapter { public func dataTask(response endpoint: Endpoint) -> APIDataTask { - var taskResolver: ((URLSessionTask?) -> Void)? - let taskPromise = Guarantee { resolver in - taskResolver = resolver - } - let responsePromise = Promise { resolver in - dataTask(response: endpoint, creation: { dataTask in - taskResolver?(dataTask) - }, completion: { result in - if taskPromise.isPending { - taskResolver?(nil) - } - switch result { - case .value(let value): - resolver.fulfill(value) - case .error(let error): - resolver.reject(error) - } - }) - } - return APIDataTask(sessionTask: taskPromise, response: responsePromise) + let task = Guarantee.pending() + let response = Promise.pending() + + dataTask(response: endpoint, creation: { dataTask in + task.resolve(dataTask) + }, completion: { result in + if task.guarantee.isPending { + task.resolve(nil) + } + switch result { + case .value(let value): + response.resolver.fulfill(value) + case .error(let error): + response.resolver.reject(error) + } + }) + return APIDataTask(sessionTask: task.guarantee, response: response.promise) } public func dataTask(data endpoint: APIEndpoint) -> APIDataTask { - var taskResolver: ((URLSessionTask?) -> Void)? - let taskPromise = Guarantee { resolver in - taskResolver = resolver - } - let responsePromise = Promise { resolver in - dataTask(data: endpoint, creation: { dataTask in - taskResolver?(dataTask) - }, completion: { result in - if taskPromise.isPending { - taskResolver?(nil) - } - switch result { - case .value(let value): - resolver.fulfill(value) - case .error(let error): - resolver.reject(error) - } - }) - } - return APIDataTask(sessionTask: taskPromise, response: responsePromise) + let task = Guarantee.pending() + let response = Promise.pending() + + dataTask(data: endpoint, creation: { dataTask in + task.resolve(dataTask) + }, completion: { result in + if task.guarantee.isPending { + task.resolve(nil) + } + switch result { + case .value(let value): + response.resolver.fulfill(value) + case .error(let error): + response.resolver.reject(error) + } + }) + return APIDataTask(sessionTask: task.guarantee, response: response.promise) } } From d948368ff1d117a459907865c725adf20f58d358 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20Ka=C5=A1par=20Jir=C3=A1sek?= Date: Fri, 8 Feb 2019 15:15:04 +0100 Subject: [PATCH 2/2] Pass resolvers as functions --- .../PromiseKit/URLSessionAPIAdapter+PromiseKit.swift | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/Extensions/PromiseKit/URLSessionAPIAdapter+PromiseKit.swift b/Extensions/PromiseKit/URLSessionAPIAdapter+PromiseKit.swift index 42a460f..830ab69 100644 --- a/Extensions/PromiseKit/URLSessionAPIAdapter+PromiseKit.swift +++ b/Extensions/PromiseKit/URLSessionAPIAdapter+PromiseKit.swift @@ -15,13 +15,10 @@ public struct APIDataTask { extension URLSessionAPIAdapter { public func dataTask(response endpoint: Endpoint) -> APIDataTask { - let task = Guarantee.pending() let response = Promise.pending() - dataTask(response: endpoint, creation: { dataTask in - task.resolve(dataTask) - }, completion: { result in + dataTask(response: endpoint, creation: task.resolve, completion: { result in if task.guarantee.isPending { task.resolve(nil) } @@ -36,13 +33,10 @@ extension URLSessionAPIAdapter { } public func dataTask(data endpoint: APIEndpoint) -> APIDataTask { - let task = Guarantee.pending() let response = Promise.pending() - dataTask(data: endpoint, creation: { dataTask in - task.resolve(dataTask) - }, completion: { result in + dataTask(data: endpoint, creation: task.resolve, completion: { result in if task.guarantee.isPending { task.resolve(nil) }