Skip to content

Commit f9067cd

Browse files
committed
Move Concurrency Client to Client
1 parent ed80e31 commit f9067cd

File tree

9 files changed

+147
-268
lines changed

9 files changed

+147
-268
lines changed

Example/Example/Sources/Business Logic/Service/BookService.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ protocol BookService {
1818

1919
final class BookServiceImpl: BookService {
2020

21-
let apiClient: ConcurrencyClient
21+
let apiClient: Client
2222

23-
init(apiClient: ConcurrencyClient) {
23+
init(apiClient: Client) {
2424
self.apiClient = apiClient
2525
}
2626

Example/Example/Sources/Business Logic/Service/FileService.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ protocol FileService {
1717

1818
final class FileServiceImpl: FileService {
1919

20-
let apiClient: ConcurrencyClient
20+
let apiClient: Client
2121

22-
init(apiClient: ConcurrencyClient) {
22+
init(apiClient: Client) {
2323
self.apiClient = apiClient
2424
}
2525

Example/Example/Sources/Business Logic/ServiceLayer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ final class ServiceLayer {
1515

1616
static let shared = ServiceLayer()
1717

18-
private(set) lazy var apiClient: ConcurrencyClient = AlamofireClient(
18+
private(set) lazy var apiClient: Client = AlamofireClient(
1919
baseURL: URL(string: "https://library.mock-object.redmadserver.com/api/v1/")!,
2020
configuration: .ephemeral,
2121
responseObserver: { [weak self] request, response, data, error in

Sources/Apexy/Client.swift

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
import Foundation
22

3+
@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
34
public protocol Client: AnyObject {
4-
55
/// Send request to specified endpoint.
6-
///
76
/// - Parameters:
8-
/// - endpoint: endpoint of remote content.
9-
/// - completionHandler: The completion closure to be executed when request is completed.
10-
/// - Returns: The progress of fetching the response data from the server for the request.
11-
func request<T>(
12-
_ endpoint: T,
13-
completionHandler: @escaping (APIResult<T.Content>) -> Void
14-
) -> Progress where T: Endpoint
7+
/// - endpoint: endpoint of remote content.
8+
/// - Returns: response data from the server for the request.
9+
func request<T>(_ endpoint: T) async throws -> T.Content where T: Endpoint
10+
11+
/// Upload data to specified endpoint.
12+
/// - Parameters:
13+
/// - endpoint: endpoint of remote content.
14+
/// - Returns: response data from the server for the upload.
15+
func upload<T>(_ endpoint: T) async throws -> T.Content where T: UploadEndpoint
1516

1617
}

Sources/Apexy/Clients/ConcurrencyClient.swift

Lines changed: 0 additions & 24 deletions
This file was deleted.

Sources/ApexyAlamofire/AlamofireClient+Concurrency.swift

Lines changed: 0 additions & 82 deletions
This file was deleted.

Sources/ApexyAlamofire/AlamofireClient.swift

Lines changed: 63 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import Apexy
1010
import Foundation
1111

1212
/// API Client.
13+
@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
1314
open class AlamofireClient: Client, CombineClient {
1415

1516
/// Session network manager.
@@ -93,43 +94,72 @@ open class AlamofireClient: Client, CombineClient {
9394
eventMonitors: eventMonitors)
9495
}
9596

96-
/// Send request to specified endpoint.
97-
///
98-
/// - Parameters:
99-
/// - endpoint: endpoint of remote content.
100-
/// - completionHandler: The completion closure to be executed when request is completed.
101-
/// - Returns: The progress of fetching the response data from the server for the request.
102-
open func request<T>(
103-
_ endpoint: T,
104-
completionHandler: @escaping (APIResult<T.Content>) -> Void
105-
) -> Progress where T: Endpoint {
106-
97+
func observeResponse(
98+
dataResponse: DataResponse<Data, AFError>,
99+
error: Error?) {
100+
self.responseObserver?(
101+
dataResponse.request,
102+
dataResponse.response,
103+
dataResponse.data,
104+
error)
105+
}
106+
107+
open func request<T>(_ endpoint: T) async throws -> T.Content where T : Endpoint {
108+
107109
let anyRequest = AnyRequest(create: endpoint.makeRequest)
108110
let request = sessionManager.request(anyRequest)
109111
.validate { request, response, data in
110112
Result(catching: { try endpoint.validate(request, response: response, data: data) })
111-
}.responseData(
112-
queue: responseQueue,
113-
completionHandler: { (response: DataResponse<Data, AFError>) in
114-
115-
let result = APIResult<T.Content>(catching: { () throws -> T.Content in
116-
do {
117-
let data = try response.result.get()
118-
return try endpoint.content(from: response.response, with: data)
119-
} catch {
120-
throw error.unwrapAlamofireValidationError()
121-
}
122-
})
123-
124-
self.completionQueue.async {
125-
self.responseObserver?(response.request, response.response, response.data, result.error)
126-
completionHandler(result)
127-
}
128-
})
129-
130-
let progress = request.downloadProgress
131-
progress.cancellationHandler = { [weak request] in request?.cancel() }
132-
return progress
113+
}
114+
115+
let dataResponse = await request.serializingData().response
116+
let result = APIResult<T.Content>(catching: { () throws -> T.Content in
117+
do {
118+
let data = try dataResponse.result.get()
119+
return try endpoint.content(from: dataResponse.response, with: data)
120+
} catch {
121+
throw error.unwrapAlamofireValidationError()
122+
}
123+
})
124+
125+
Task.detached { [weak self, dataResponse, result] in
126+
self?.observeResponse(dataResponse: dataResponse, error: result.error)
127+
}
128+
129+
return try result.get()
130+
}
131+
132+
open func upload<T>(_ endpoint: T) async throws -> T.Content where T : UploadEndpoint {
133+
134+
let urlRequest: URLRequest
135+
let body: UploadEndpointBody
136+
(urlRequest, body) = try endpoint.makeRequest()
137+
138+
let request: UploadRequest
139+
switch body {
140+
case .data(let data):
141+
request = sessionManager.upload(data, with: urlRequest)
142+
case .file(let url):
143+
request = sessionManager.upload(url, with: urlRequest)
144+
case .stream(let stream):
145+
request = sessionManager.upload(stream, with: urlRequest)
146+
}
147+
148+
let dataResponse = await request.serializingData().response
149+
let result = APIResult<T.Content>(catching: { () throws -> T.Content in
150+
do {
151+
let data = try dataResponse.result.get()
152+
return try endpoint.content(from: dataResponse.response, with: data)
153+
} catch {
154+
throw error.unwrapAlamofireValidationError()
155+
}
156+
})
157+
158+
Task.detached { [weak self, dataResponse, result] in
159+
self?.observeResponse(dataResponse: dataResponse, error: result.error)
160+
}
161+
162+
return try result.get()
133163
}
134164

135165
}

Sources/ApexyURLSession/URLSessionClient+Concurrency.swift

Lines changed: 0 additions & 90 deletions
This file was deleted.

0 commit comments

Comments
 (0)