mirror of
https://github.com/yattee/yattee.git
synced 2026-07-19 22:02:10 +00:00
Migrate CloudKit sync to state-driven CKSyncEngine pattern
Register pending changes with the engine state instead of keeping app-managed record arrays, and materialize records from local data at send time in nextRecordZoneChangeBatch. This fixes several data-loss paths: - Pending changes now persist inside the engine state serialization, so saves queued during the debounce window (or while offline) survive app termination. Legacy record-name keys are migrated once. - Transient CloudKit errors (zoneBusy, serviceUnavailable, rate limits, network failures, limitExceeded, batchRequestFailed) re-register the change for engine-scheduled retry instead of silently dropping it. - Conflicts are resolved against the exact record that was sent; the resolved record (carrying the server change tag) is cached and takes precedence at the next send, and any newer local edit evicts it. - Queue methods are now synchronous, removing a task-reordering race where a fast delete/re-add could end up deleting the re-added entity. - Records are built fresh at send time, so queued changes no longer upload stale field snapshots, and batch size limits are handled by the framework.
This commit is contained in: