Skip to content

Commit 9224f52

Browse files
committed
Revert "Fix batch methods and add tests"
This reverts commit 0f137fa.
1 parent 5c7cbe0 commit 9224f52

6 files changed

Lines changed: 156 additions & 269 deletions

File tree

Sources/CoreDataRepository/CoreDataRepository+Batch.swift

Lines changed: 114 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Sources/CoreDataRepository/Internal/NSManagedObjectContext+Scratchpad.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,16 @@ extension NSManagedObjectContext {
2121
} catch let error as CoreDataError {
2222
await scratchPad.perform {
2323
scratchPad.rollback()
24-
scratchPad.parent?.rollback()
2524
}
2625
return .failure(error)
2726
} catch let error as CocoaError {
2827
await scratchPad.perform {
2928
scratchPad.rollback()
30-
scratchPad.parent?.rollback()
3129
}
3230
return .failure(.cocoa(error))
3331
} catch let error as NSError {
3432
await scratchPad.perform {
3533
scratchPad.rollback()
36-
scratchPad.parent?.rollback()
3734
}
3835
return .failure(CoreDataError.unknown(error))
3936
}

0 commit comments

Comments
 (0)