crossmate

A collaborative crossword app for iOS
Log | Files | Refs | LICENSE

commit 34d5d0683648994eabd4a4fe65c8992f0603ac24
parent f3901ffa4c4c7ff29ab6b04825a6e8eb2e67c8d9
Author: Michael Camilleri <[email protected]>
Date:   Fri, 24 Apr 2026 18:08:32 +0900

Make iCloud error recording asynchronous

Diffstat:
MCrossmate/Sync/SyncEngine.swift | 17+++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/Crossmate/Sync/SyncEngine.swift b/Crossmate/Sync/SyncEngine.swift @@ -538,19 +538,28 @@ actor SyncEngine { private func handleSentRecordZoneChanges( _ event: CKSyncEngine.Event.SentRecordZoneChanges - ) { + ) async { + var failureMessages: [String] = [] let ctx = persistence.container.newBackgroundContext() ctx.performAndWait { for record in event.savedRecords { self.writeBackSystemFields(record: record, in: ctx) } for failure in event.failedRecordSaves { - self.trace( - "send: failed to save \(failure.record.recordID.recordName): \(failure.error.localizedDescription)" + let name = failure.record.recordID.recordName + let err = failure.error as NSError + let userInfo = err.userInfo + .map { "\($0.key)=\($0.value)" } + .joined(separator: " | ") + failureMessages.append( + "send: failed to save \(name) — domain=\(err.domain) code=\(err.code) \(err.localizedDescription) | userInfo: \(userInfo)" ) } if ctx.hasChanges { try? ctx.save() } } + for message in failureMessages { + await trace(message) + } } private nonisolated func writeBackSystemFields( @@ -624,7 +633,7 @@ extension SyncEngine: CKSyncEngineDelegate { break case .sentRecordZoneChanges(let e): - handleSentRecordZoneChanges(e) + await handleSentRecordZoneChanges(e) case .willFetchChanges, .didFetchChanges, .willSendChanges, .didSendChanges: