Skip to content

Commit 0f137fa

Browse files
committed
Fix batch methods and add tests
3.0-preview-fix-batch-methods
1 parent 5c22915 commit 0f137fa

6 files changed

Lines changed: 269 additions & 156 deletions

File tree

Sources/CoreDataRepository/CoreDataRepository+Batch.swift

Lines changed: 37 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -35,35 +35,14 @@ extension CoreDataRepository {
3535
) async -> (success: [Model], failed: [CoreDataBatchError<Model>]) {
3636
var successes = [Model]()
3737
var failures = [CoreDataBatchError<Model>]()
38-
await withTaskGroup(of: Result<Model, CoreDataBatchError<Model>>.self, body: { [weak self] group in
39-
guard let self else {
40-
group.cancelAll()
41-
return
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))
4244
}
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-
})
45+
}
6746
return (success: successes, failed: failures)
6847
}
6948

@@ -98,34 +77,14 @@ extension CoreDataRepository {
9877
) async -> (success: [Model], failed: [CoreDataBatchError<URL>]) {
9978
var successes = [Model]()
10079
var failures = [CoreDataBatchError<URL>]()
101-
await withTaskGroup(of: Result<Model, CoreDataBatchError<URL>>.self, body: { [weak self] group in
102-
guard let self else {
103-
group.cancelAll()
104-
return
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))
10586
}
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-
})
87+
}
12988
return (success: successes, failed: failures)
13089
}
13190

@@ -169,38 +128,23 @@ extension CoreDataRepository {
169128
) async -> (success: [Model], failed: [CoreDataBatchError<Model>]) {
170129
var successes = [Model]()
171130
var failures = [CoreDataBatchError<Model>]()
172-
await withTaskGroup(of: Result<Model, CoreDataBatchError<Model>>.self, body: { [weak self] group in
173-
guard let self else {
174-
group.cancelAll()
175-
return
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))
176146
}
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-
})
147+
}
204148
return (success: successes, failed: failures)
205149
}
206150

@@ -256,35 +200,14 @@ extension CoreDataRepository {
256200
) async -> (success: [URL], failed: [CoreDataBatchError<URL>]) {
257201
var successes = [URL]()
258202
var failures = [CoreDataBatchError<URL>]()
259-
await withTaskGroup(of: Result<URL, CoreDataBatchError<URL>>.self, body: { [weak self] group in
260-
guard let self else {
261-
group.cancelAll()
262-
return
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))
263209
}
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-
})
210+
}
288211
return (success: successes, failed: failures)
289212
}
290213

Sources/CoreDataRepository/Internal/NSManagedObjectContext+Scratchpad.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,19 @@ extension NSManagedObjectContext {
2121
} catch let error as CoreDataError {
2222
await scratchPad.perform {
2323
scratchPad.rollback()
24+
scratchPad.parent?.rollback()
2425
}
2526
return .failure(error)
2627
} catch let error as CocoaError {
2728
await scratchPad.perform {
2829
scratchPad.rollback()
30+
scratchPad.parent?.rollback()
2931
}
3032
return .failure(.cocoa(error))
3133
} catch let error as NSError {
3234
await scratchPad.perform {
3335
scratchPad.rollback()
36+
scratchPad.parent?.rollback()
3437
}
3538
return .failure(CoreDataError.unknown(error))
3639
}

0 commit comments

Comments
 (0)