@@ -35,14 +35,35 @@ extension CoreDataRepository {
3535 ) async -> ( success: [ Model ] , failed: [ CoreDataBatchError < Model > ] ) {
3636 var successes = [ Model] ( )
3737 var failures = [ CoreDataBatchError < Model > ] ( )
38- for item in items {
39- switch await create ( item, transactionAuthor: transactionAuthor) {
40- case let . success( created) :
41- successes. append ( created)
42- case let . failure( error) :
43- failures. append ( CoreDataBatchError ( item: item, error: error) )
38+ await withTaskGroup ( of: Result< Model, CoreDataBatchError< Model>>. self , body: { [ weak self] group in
39+ guard let self else {
40+ group. cancelAll ( )
41+ return
4442 }
45- }
43+ for item in items {
44+ let added = group. addTaskUnlessCancelled {
45+ async let result : Result < Model , CoreDataError > = self
46+ . create ( item, transactionAuthor: transactionAuthor)
47+ switch await result {
48+ case let . success ( created) :
49+ return . success( created)
50+ case let . failure( error) :
51+ return . failure ( CoreDataBatchError( item: item , error: error ) )
52+ }
53+ }
54+ if !added {
55+ return
56+ }
57+ }
58+ for await result in group {
59+ switch result {
60+ case let . success( success) :
61+ successes. append ( success)
62+ case let . failure( failure) :
63+ failures. append ( failure)
64+ }
65+ }
66+ } )
4667 return ( success: successes, failed: failures)
4768 }
4869
@@ -77,14 +98,34 @@ extension CoreDataRepository {
7798 ) async -> ( success: [ Model ] , failed: [ CoreDataBatchError < URL > ] ) {
7899 var successes = [ Model] ( )
79100 var failures = [ CoreDataBatchError < URL > ] ( )
80- for url in urls {
81- switch await read ( url, of: Model . self) {
82- case let . success( created) :
83- successes. append ( created)
84- case let . failure( error) :
85- failures. append ( CoreDataBatchError ( item: url, error: error) )
101+ await withTaskGroup ( of: Result< Model, CoreDataBatchError< URL>>. self , body: { [ weak self] group in
102+ guard let self else {
103+ group. cancelAll ( )
104+ return
86105 }
87- }
106+ for url in urls {
107+ let added = group. addTaskUnlessCancelled {
108+ async let result = self . read ( url, of: Model . self)
109+ switch await result {
110+ case let . success ( created) :
111+ return . success( created)
112+ case let . failure( error) :
113+ return . failure ( CoreDataBatchError( item: url , error: error ) )
114+ }
115+ }
116+ if !added {
117+ return
118+ }
119+ }
120+ for await result in group {
121+ switch result {
122+ case let . success( success) :
123+ successes. append ( success)
124+ case let . failure( failure) :
125+ failures. append ( failure)
126+ }
127+ }
128+ } )
88129 return ( success: successes, failed: failures)
89130 }
90131
@@ -128,23 +169,38 @@ extension CoreDataRepository {
128169 ) async -> ( success: [ Model ] , failed: [ CoreDataBatchError < Model > ] ) {
129170 var successes = [ Model] ( )
130171 var failures = [ CoreDataBatchError < Model > ] ( )
131- for item in items {
132- guard let url = item. managedIdUrl else {
133- failures. append ( CoreDataBatchError ( item: item, error: . noUrlOnItemToMapToObjectId) )
134- continue
135- }
136- async let result : Result < Model , CoreDataError > = update (
137- url,
138- with: item,
139- transactionAuthor: transactionAuthor
140- )
141- switch await result {
142- case let . success ( created) :
143- successes. append ( created)
144- case let . failure( error) :
145- failures . append ( CoreDataBatchError( item: item , error: error ) )
172+ await withTaskGroup ( of: Result< Model, CoreDataBatchError< Model>>. self , body: { [ weak self] group in
173+ guard let self else {
174+ group. cancelAll ( )
175+ return
146176 }
147- }
177+ for item in items {
178+ let added = group. addTaskUnlessCancelled {
179+ guard let url = item. managedIdUrl else {
180+ return . failure( CoreDataBatchError ( item: item, error: . noUrlOnItemToMapToObjectId) )
181+ }
182+ async let result : Result < Model , CoreDataError > = self
183+ . update ( url, with: item, transactionAuthor: transactionAuthor)
184+ switch await result {
185+ case let . success ( created) :
186+ return . success( created)
187+ case let . failure( error) :
188+ return . failure ( CoreDataBatchError( item: item , error: error ) )
189+ }
190+ }
191+ if !added {
192+ return
193+ }
194+ }
195+ for await result in group {
196+ switch result {
197+ case let . success( success) :
198+ successes. append ( success)
199+ case let . failure( failure) :
200+ failures. append ( failure)
201+ }
202+ }
203+ } )
148204 return ( success: successes, failed: failures)
149205 }
150206
@@ -200,14 +256,35 @@ extension CoreDataRepository {
200256 ) async -> ( success: [ URL ] , failed: [ CoreDataBatchError < URL > ] ) {
201257 var successes = [ URL] ( )
202258 var failures = [ CoreDataBatchError < URL > ] ( )
203- for url in urls {
204- switch await delete ( url, transactionAuthor: transactionAuthor) {
205- case . success:
206- successes. append ( url)
207- case let . failure( error) :
208- failures. append ( CoreDataBatchError ( item: url, error: error) )
259+ await withTaskGroup ( of: Result< URL, CoreDataBatchError< URL>>. self , body: { [ weak self] group in
260+ guard let self else {
261+ group. cancelAll ( )
262+ return
209263 }
210- }
264+ for url in urls {
265+ let added = group. addTaskUnlessCancelled {
266+ async let result : Result < Void , CoreDataError > = self
267+ . delete ( url, transactionAuthor: transactionAuthor)
268+ switch await result {
269+ case . success:
270+ return . success( url)
271+ case let . failure( error) :
272+ return . failure ( CoreDataBatchError( item: url , error: error ) )
273+ }
274+ }
275+ if !added {
276+ return
277+ }
278+ }
279+ for await result in group {
280+ switch result {
281+ case let . success( success) :
282+ successes. append ( success)
283+ case let . failure( failure) :
284+ failures. append ( failure)
285+ }
286+ }
287+ } )
211288 return ( success: successes, failed: failures)
212289 }
213290
0 commit comments