@@ -31,9 +31,17 @@ public protocol NetworkDataTransferService: AnyObject {
3131 @available ( iOS 16 , * )
3232 func request< T: Decodable , E: RequestableEndpoint > ( with endpoint: E ) async -> TaskType < T > where E. ResponseType == T
3333
34+ @available ( macOS 10 . 15 , * )
35+ @available ( iOS 16 , * )
36+ func request< T: Decodable , E: RequestableEndpoint > ( with endpoint: E ) async throws -> T where E. ResponseType == T
37+
3438 @available ( iOS 16 , * )
3539 @available ( macOS 10 . 15 , * )
3640 func request< T: Decodable , E: RequestableEndpoint > ( with endpoints: [ E ] ) async -> TaskTypeCollection < T > where E. ResponseType == T
41+
42+ @available ( iOS 16 , * )
43+ @available ( macOS 10 . 15 , * )
44+ func request< T: Decodable , E: RequestableEndpoint > ( with endpoints: [ E ] ) async throws -> [ T ] where E. ResponseType == T
3745}
3846
3947// MARK: Concrete Implementation
@@ -68,6 +76,35 @@ public final class DefaultNetworkDataTransferService {
6876 group. leave ( )
6977 }
7078 }
79+
80+
81+ private func decode< T: Decodable > ( data: Data ? , decoder: ResponseDecoder ) -> Result < T , NetworkDataTransferError > {
82+ do {
83+ guard let data = data else {
84+ return . failure( NetworkDataTransferError . noResponse)
85+ }
86+
87+ let decoded : T = try decoder. decode ( data: data)
88+ return . success( decoded)
89+ } catch {
90+ self . logger. log ( error: error)
91+ return . failure( NetworkDataTransferError . parsing ( error) )
92+ }
93+ }
94+
95+ private func decode< T: Decodable > ( data: Data ? , decoder: ResponseDecoder ) throws -> T {
96+ do {
97+ guard let data = data else {
98+ throw NetworkDataTransferError . noResponse
99+ }
100+
101+ let decoded : T = try decoder. decode ( data: data)
102+ return decoded
103+ } catch {
104+ self . logger. log ( error: error)
105+ throw NetworkDataTransferError . parsing ( error)
106+ }
107+ }
71108}
72109
73110extension DefaultNetworkDataTransferService : NetworkDataTransferService {
@@ -101,6 +138,36 @@ extension DefaultNetworkDataTransferService: NetworkDataTransferService {
101138 return requestCollection
102139 }
103140
141+ public func request< T: Decodable , E: RequestableEndpoint > (
142+ with endpoint: E ,
143+ on queue: ( any NetworkDataTransferQueue ) ? = nil ,
144+ completion: @escaping ( Result < T , NetworkDataTransferError > ) -> Void
145+ ) -> ( any CancellableHttpRequest ) ? where E. ResponseType == T {
146+
147+ return networkService. request ( endpoint: endpoint) { result in
148+ let completionResult : Result < T , NetworkDataTransferError >
149+
150+ defer {
151+ if let queue = queue {
152+ queue. asyncExecute {
153+ completion ( completionResult)
154+ }
155+ }
156+ completion ( completionResult)
157+ }
158+
159+ switch result {
160+ case . success( let data) :
161+ let result : Result < T , NetworkDataTransferError > = self . decode ( data: data, decoder: endpoint. responseDecoder)
162+ completionResult = result
163+ case . failure( let error) :
164+ self . logger. log ( error: error)
165+ completionResult = . failure( . networkFailure( error) )
166+ }
167+ }
168+
169+ }
170+
104171 @available ( macOS 10 . 15 , * )
105172 @available ( iOS 16 , * )
106173 public func request< T: Decodable , E: RequestableEndpoint > ( with endpoints: [ E ] ) async -> TaskTypeCollection < T > where T == E . ResponseType {
@@ -130,72 +197,45 @@ extension DefaultNetworkDataTransferService: NetworkDataTransferService {
130197
131198 @available ( macOS 10 . 15 , * )
132199 @available ( iOS 16 , * )
133- public func request< T: Decodable , E: RequestableEndpoint > ( with endpoint: E ) async -> TaskType < T > where T == E . ResponseType {
134- let task = Task {
135- let responseData = try await networkService. request ( endpoint: endpoint) . value
136- let decodedData : T = try self . decode ( data: responseData, decoder: endpoint. responseDecoder)
137-
138- return decodedData
139- }
140-
141- return task
142- }
143-
144- public func request< T: Decodable , E: RequestableEndpoint > (
145- with endpoint: E ,
146- on queue: ( any NetworkDataTransferQueue ) ? = nil ,
147- completion: @escaping ( Result < T , NetworkDataTransferError > ) -> Void
148- ) -> ( any CancellableHttpRequest ) ? where E. ResponseType == T {
149-
150- return networkService. request ( endpoint: endpoint) { result in
151- let completionResult : Result < T , NetworkDataTransferError >
152-
153- defer {
154- if let queue = queue {
155- queue. asyncExecute {
156- completion ( completionResult)
157- }
200+ public func request< T: Decodable , E: RequestableEndpoint > ( with endpoints: [ E ] ) async throws -> [ T ] where T == E . ResponseType {
201+ let responseData = try await withThrowingTaskGroup ( of: T . self, returning: [ T ] . self) { taskGroup in
202+ for endpoint in endpoints {
203+ taskGroup. addTask {
204+ try await self . request ( with: endpoint) . value
158205 }
159- completion ( completionResult)
160206 }
161207
162- switch result {
163- case . success( let data) :
164- let result : Result < T , NetworkDataTransferError > = self . decode ( data: data, decoder: endpoint. responseDecoder)
165- completionResult = result
166- case . failure( let error) :
167- self . logger. log ( error: error)
168- completionResult = . failure( . networkFailure( error) )
208+ var data : [ T ] = [ ]
209+
210+ for try await item in taskGroup {
211+ data. append ( item)
169212 }
213+
214+ return data
170215 }
171216
217+ return responseData
172218 }
173219
174- private func decode< T: Decodable > ( data: Data ? , decoder: ResponseDecoder ) -> Result < T , NetworkDataTransferError > {
175- do {
176- guard let data = data else {
177- return . failure( NetworkDataTransferError . noResponse)
178- }
220+ @available ( macOS 10 . 15 , * )
221+ @available ( iOS 16 , * )
222+ public func request< T: Decodable , E: RequestableEndpoint > ( with endpoint: E ) async -> TaskType < T > where T == E . ResponseType {
223+ let task = Task {
224+ let responseData = try await networkService. request ( endpoint: endpoint) . value
225+ let decodedData : T = try self . decode ( data: responseData, decoder: endpoint. responseDecoder)
179226
180- let decoded : T = try decoder. decode ( data: data)
181- return . success( decoded)
182- } catch {
183- self . logger. log ( error: error)
184- return . failure( NetworkDataTransferError . parsing ( error) )
227+ return decodedData
185228 }
229+
230+ return task
186231 }
187232
188- private func decode< T: Decodable > ( data: Data ? , decoder: ResponseDecoder ) throws -> T {
189- do {
190- guard let data = data else {
191- throw NetworkDataTransferError . noResponse
192- }
193-
194- let decoded : T = try decoder. decode ( data: data)
195- return decoded
196- } catch {
197- self . logger. log ( error: error)
198- throw NetworkDataTransferError . parsing ( error)
199- }
233+ @available ( macOS 10 . 15 , * )
234+ @available ( iOS 16 , * )
235+ public func request< T: Decodable , E: RequestableEndpoint > ( with endpoint: E ) async throws -> T where T == E . ResponseType {
236+ let responseData = try await networkService. request ( endpoint: endpoint) . value
237+ let decodedData : T = try self . decode ( data: responseData, decoder: endpoint. responseDecoder)
238+
239+ return decodedData
200240 }
201241}
0 commit comments