Skip to content

Commit e549af8

Browse files
committed
wip
1 parent ecc9dc0 commit e549af8

3 files changed

Lines changed: 51 additions & 19 deletions

File tree

Examples/Reminders/Schema.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ func appDatabase() throws -> any DatabaseWriter {
142142
db.trace(options: .profile) {
143143
if context == .live {
144144
logger.debug("\($0.expandedDescription)")
145-
} else {
145+
} else if context == .preview {
146146
print("\($0.expandedDescription)")
147147
}
148148
}
@@ -387,8 +387,10 @@ nonisolated private let logger = Logger(subsystem: "Reminders", category: "Datab
387387
func seedSampleData() throws {
388388
@Dependency(\.date.now) var now
389389
@Dependency(\.uuid) var uuid
390-
let remindersListIDs = (0...2).map { _ in uuid() }
391-
let reminderIDs = (0...10).map { _ in uuid() }
390+
let remindersListIDs = [uuid(), uuid(), uuid()]
391+
let reminderIDs = [
392+
uuid(), uuid(), uuid(), uuid(), uuid(), uuid(), uuid(), uuid(), uuid(), uuid(), uuid()
393+
]
392394
try seed {
393395
RemindersList(
394396
id: remindersListIDs[0],

Examples/RemindersTests/RemindersListsTests.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ extension BaseTestSuite {
108108

109109
@Test func share() async throws {
110110
let model = RemindersListsModel()
111+
111112
let personalRemindersList = try #require(
112113
try await database.read { db in
113114
try RemindersList.find(UUID(0)).fetchOne(db)

Sources/SQLiteData/CloudKit/SyncEngine.swift

Lines changed: 45 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import OrderedCollections
66
import OSLog
77
import Observation
8+
import Perception
89
import StructuredQueriesCore
910
import SwiftData
1011
import TabularData
@@ -423,6 +424,19 @@
423424
}
424425
}
425426

427+
private let _isReady = LockIsolated(false)
428+
private var isReady: Bool {
429+
get {
430+
observationRegistrar.access(self, keyPath: \.isReady)
431+
return _isReady.withValue(\.self)
432+
}
433+
set {
434+
observationRegistrar.withMutation(of: self, keyPath: \.isReady) {
435+
_isReady.withValue { $0 = newValue }
436+
}
437+
}
438+
}
439+
426440
/// Determines if the sync engine is currently running or not.
427441
public var isRunning: Bool {
428442
observationRegistrar.access(self, keyPath: \.isRunning)
@@ -440,11 +454,9 @@
440454
private: privateSyncEngine,
441455
shared: sharedSyncEngine
442456
)
457+
privateSyncEngine.state.add(pendingDatabaseChanges: [.saveZone(defaultZone)])
443458
}
444459
}
445-
syncEngines.withValue {
446-
$0.private?.state.add(pendingDatabaseChanges: [.saveZone(defaultZone)])
447-
}
448460

449461
let previousRecordTypes = try metadatabase.read { db in
450462
try RecordType.all.fetchAll(db)
@@ -492,23 +504,29 @@
492504
($0.tableName, $0)
493505
}
494506
)
507+
508+
withErrorReporting(.sqliteDataCloudKitFailure) {
509+
try uploadRecordsToCloudKit(
510+
previousRecordTypeByTableName: previousRecordTypeByTableName,
511+
currentRecordTypeByTableName: currentRecordTypeByTableName
512+
)
513+
}
514+
495515
return Task {
496516
await withErrorReporting(.sqliteDataCloudKitFailure) {
497517
guard try await container.accountStatus() == .available
498518
else { return }
499-
try await uploadRecordsToCloudKit(
500-
previousRecordTypeByTableName: previousRecordTypeByTableName,
501-
currentRecordTypeByTableName: currentRecordTypeByTableName
502-
)
519+
503520
try await updateLocalFromSchemaChange(
504521
previousRecordTypeByTableName: previousRecordTypeByTableName,
505522
currentRecordTypeByTableName: currentRecordTypeByTableName
506523
)
507524
try await cacheUserTables(recordTypes: currentRecordTypes)
508525
}
526+
isReady = true
509527
}
510528
}
511-
529+
512530
/// Fetches pending remote changes from the server.
513531
///
514532
/// Use this method to ensure the sync engine immediately fetches all pending remote changes
@@ -520,6 +538,7 @@
520538
public func fetchChanges(
521539
_ options: CKSyncEngine.FetchChangesOptions = CKSyncEngine.FetchChangesOptions()
522540
) async throws {
541+
await isReady()
523542
let (privateSyncEngine, sharedSyncEngine) = syncEngines.withValue {
524543
($0.private, $0.shared)
525544
}
@@ -529,7 +548,7 @@
529548
async let shared: Void = sharedSyncEngine.fetchChanges(options)
530549
_ = try await (`private`, shared)
531550
}
532-
551+
533552
/// Sends pending local changes to the server.
534553
///
535554
/// Use this method to ensure the sync engine sends all pending local changes to the server
@@ -541,6 +560,7 @@
541560
public func sendChanges(
542561
_ options: CKSyncEngine.SendChangesOptions = CKSyncEngine.SendChangesOptions()
543562
) async throws {
563+
await isReady()
544564
let (privateSyncEngine, sharedSyncEngine) = syncEngines.withValue {
545565
($0.private, $0.shared)
546566
}
@@ -550,7 +570,12 @@
550570
async let shared: Void = sharedSyncEngine.sendChanges(options)
551571
_ = try await (`private`, shared)
552572
}
553-
573+
574+
private func isReady() async {
575+
guard !isRunning else { return }
576+
_ = await Perceptions { self.isReady }.first(where: { $0 })
577+
}
578+
554579
/// Synchronizes local and remote pending changes.
555580
///
556581
/// Use this method to ensure the sync engine immediately fetches all pending remote changes
@@ -580,9 +605,9 @@
580605
private func uploadRecordsToCloudKit(
581606
previousRecordTypeByTableName: [String: RecordType],
582607
currentRecordTypeByTableName: [String: RecordType]
583-
) async throws {
584-
try await enqueueLocallyPendingChanges()
585-
try await userDatabase.write { db in
608+
) throws {
609+
try enqueueLocallyPendingChanges()
610+
try userDatabase.write { db in
586611
try PendingRecordZoneChange.delete().execute(db)
587612

588613
let newTableNames = currentRecordTypeByTableName.keys.filter { tableName in
@@ -597,8 +622,8 @@
597622
}
598623
}
599624

600-
private func enqueueLocallyPendingChanges() async throws {
601-
let pendingRecordZoneChanges = try await metadatabase.read { db in
625+
private func enqueueLocallyPendingChanges() throws {
626+
let pendingRecordZoneChanges = try metadatabase.read { db in
602627
try PendingRecordZoneChange
603628
.select(\.pendingRecordZoneChange)
604629
.fetchAll(db)
@@ -1858,7 +1883,8 @@
18581883
}
18591884

18601885
private func refreshLastKnownServerRecord(_ record: CKRecord) async {
1861-
await withErrorReporting(.sqliteDataCloudKitFailure) {
1886+
//await withErrorReporting(.sqliteDataCloudKitFailure) {
1887+
do {
18621888
try await metadatabase.write { db in
18631889
let metadata = try SyncMetadata.find(record.recordID).fetchOne(db)
18641890
func updateLastKnownServerRecord() throws {
@@ -1876,6 +1902,9 @@
18761902
try updateLastKnownServerRecord()
18771903
}
18781904
}
1905+
} catch {
1906+
print(error)
1907+
print("!!!")
18791908
}
18801909
}
18811910

0 commit comments

Comments
 (0)