|
199 | 199 |
|
200 | 200 | @available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) |
201 | 201 | extension SyncEngine { |
202 | | - package func processPendingRecordZoneChanges( |
| 202 | + package struct SendRecordsCallback { |
| 203 | + fileprivate let operation: @Sendable () async -> Void |
| 204 | + @discardableResult |
| 205 | + package func receive() async { |
| 206 | + await operation() |
| 207 | + } |
| 208 | + } |
| 209 | + |
| 210 | + package func sendPendingRecordZoneChanges( |
203 | 211 | options: CKSyncEngine.SendChangesOptions = CKSyncEngine.SendChangesOptions(), |
204 | 212 | scope: CKDatabase.Scope, |
205 | 213 | forceAtomicByZone: Bool? = nil, |
206 | 214 | fileID: StaticString = #fileID, |
207 | 215 | filePath: StaticString = #filePath, |
208 | 216 | line: UInt = #line, |
209 | 217 | column: UInt = #column |
210 | | - ) async throws { |
| 218 | + ) async throws -> SendRecordsCallback { |
211 | 219 | let syncEngine = syncEngine(for: scope) |
212 | 220 | guard !syncEngine.state.pendingRecordZoneChanges.isEmpty |
213 | 221 | else { |
|
218 | 226 | line: line, |
219 | 227 | column: column |
220 | 228 | ) |
221 | | - return |
| 229 | + return SendRecordsCallback {} |
222 | 230 | } |
223 | 231 | guard try await container.accountStatus() == .available |
224 | 232 | else { |
|
231 | 239 | line: line, |
232 | 240 | column: column |
233 | 241 | ) |
234 | | - return |
| 242 | + return SendRecordsCallback {} |
235 | 243 | } |
236 | 244 |
|
237 | 245 | var batch = await nextRecordZoneChangeBatch( |
|
254 | 262 | batch?.atomicByZone = forceAtomicByZone |
255 | 263 | } |
256 | 264 | guard let batch |
257 | | - else { return } |
| 265 | + else { |
| 266 | + return SendRecordsCallback {} |
| 267 | + } |
258 | 268 |
|
259 | 269 | let (saveResults, deleteResults) = try syncEngine.database.modifyRecords( |
260 | 270 | saving: batch.recordsToSave, |
|
302 | 312 | pendingRecordZoneChanges: failedRecordDeletes.keys.map { .deleteRecord($0) } |
303 | 313 | ) |
304 | 314 |
|
305 | | - await syncEngine.parentSyncEngine |
306 | | - .handleEvent( |
307 | | - .sentRecordZoneChanges( |
308 | | - savedRecords: savedRecords, |
309 | | - failedRecordSaves: failedRecordSaves, |
310 | | - deletedRecordIDs: deletedRecordIDs, |
311 | | - failedRecordDeletes: failedRecordDeletes |
312 | | - ), |
313 | | - syncEngine: syncEngine |
314 | | - ) |
| 315 | + return SendRecordsCallback { [savedRecords, failedRecordSaves, deletedRecordIDs, failedRecordDeletes] in |
| 316 | + await syncEngine.parentSyncEngine |
| 317 | + .handleEvent( |
| 318 | + .sentRecordZoneChanges( |
| 319 | + savedRecords: savedRecords, |
| 320 | + failedRecordSaves: failedRecordSaves, |
| 321 | + deletedRecordIDs: deletedRecordIDs, |
| 322 | + failedRecordDeletes: failedRecordDeletes |
| 323 | + ), |
| 324 | + syncEngine: syncEngine |
| 325 | + ) |
| 326 | + } |
| 327 | + } |
| 328 | + |
| 329 | + package func processPendingRecordZoneChanges( |
| 330 | + options: CKSyncEngine.SendChangesOptions = CKSyncEngine.SendChangesOptions(), |
| 331 | + scope: CKDatabase.Scope, |
| 332 | + forceAtomicByZone: Bool? = nil, |
| 333 | + fileID: StaticString = #fileID, |
| 334 | + filePath: StaticString = #filePath, |
| 335 | + line: UInt = #line, |
| 336 | + column: UInt = #column |
| 337 | + ) async throws { |
| 338 | + try await sendPendingRecordZoneChanges( |
| 339 | + options: options, |
| 340 | + scope: scope, |
| 341 | + forceAtomicByZone: forceAtomicByZone, |
| 342 | + fileID: fileID, |
| 343 | + filePath: filePath, |
| 344 | + line: line, |
| 345 | + column: column |
| 346 | + ) |
| 347 | + .receive() |
315 | 348 | } |
316 | 349 |
|
317 | 350 | package func processPendingDatabaseChanges( |
|
0 commit comments