updated version
Signed-off-by: Matt Bruce <mbrucedogs@gmail.com>
This commit is contained in:
parent
3c0637ed7a
commit
e0392f2c22
@ -573,7 +573,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.2;
|
MARKETING_VERSION = 1.3;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "$(APP_BUNDLE_IDENTIFIER)";
|
PRODUCT_BUNDLE_IDENTIFIER = "$(APP_BUNDLE_IDENTIFIER)";
|
||||||
PRODUCT_NAME = "$(PRODUCT_NAME)";
|
PRODUCT_NAME = "$(PRODUCT_NAME)";
|
||||||
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
||||||
@ -610,7 +610,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.2;
|
MARKETING_VERSION = 1.3;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "$(APP_BUNDLE_IDENTIFIER)";
|
PRODUCT_BUNDLE_IDENTIFIER = "$(APP_BUNDLE_IDENTIFIER)";
|
||||||
PRODUCT_NAME = "$(PRODUCT_NAME)";
|
PRODUCT_NAME = "$(PRODUCT_NAME)";
|
||||||
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
||||||
|
|||||||
@ -4,7 +4,6 @@ import SwiftData
|
|||||||
import CoreData
|
import CoreData
|
||||||
import Bedrock
|
import Bedrock
|
||||||
import WidgetKit
|
import WidgetKit
|
||||||
import os
|
|
||||||
|
|
||||||
@MainActor
|
@MainActor
|
||||||
@Observable
|
@Observable
|
||||||
@ -21,12 +20,7 @@ final class RitualStore: RitualStoreProviding {
|
|||||||
@ObservationIgnored private let isRunningTests: Bool
|
@ObservationIgnored private let isRunningTests: Bool
|
||||||
@ObservationIgnored private let dayFormatter: DateFormatter
|
@ObservationIgnored private let dayFormatter: DateFormatter
|
||||||
@ObservationIgnored private let displayFormatter: DateFormatter
|
@ObservationIgnored private let displayFormatter: DateFormatter
|
||||||
@ObservationIgnored private var remoteChangeObserver: NSObjectProtocol?
|
@ObservationIgnored private let cloudKitSyncManager: SwiftDataCloudKitSyncManager
|
||||||
@ObservationIgnored private let syncLogger = Logger(
|
|
||||||
subsystem: Bundle.main.bundleIdentifier ?? "Andromida",
|
|
||||||
category: "CloudKitSync"
|
|
||||||
)
|
|
||||||
@ObservationIgnored private var remoteChangeEventCount: Int = 0
|
|
||||||
|
|
||||||
private(set) var rituals: [Ritual] = []
|
private(set) var rituals: [Ritual] = []
|
||||||
private(set) var currentRituals: [Ritual] = []
|
private(set) var currentRituals: [Ritual] = []
|
||||||
@ -81,6 +75,10 @@ final class RitualStore: RitualStoreProviding {
|
|||||||
self.isRunningTests = isRunningTests
|
self.isRunningTests = isRunningTests
|
||||||
self.dayFormatter = DateFormatter()
|
self.dayFormatter = DateFormatter()
|
||||||
self.displayFormatter = DateFormatter()
|
self.displayFormatter = DateFormatter()
|
||||||
|
self.cloudKitSyncManager = SwiftDataCloudKitSyncManager(
|
||||||
|
isEnabled: !isRunningTests,
|
||||||
|
logIdentifier: "AndromidaCloudKitSync"
|
||||||
|
)
|
||||||
dayFormatter.calendar = calendar
|
dayFormatter.calendar = calendar
|
||||||
dayFormatter.dateFormat = "yyyy-MM-dd"
|
dayFormatter.dateFormat = "yyyy-MM-dd"
|
||||||
displayFormatter.calendar = calendar
|
displayFormatter.calendar = calendar
|
||||||
@ -98,37 +96,20 @@ final class RitualStore: RitualStoreProviding {
|
|||||||
nowProvider()
|
nowProvider()
|
||||||
}
|
}
|
||||||
|
|
||||||
deinit {
|
|
||||||
if let observer = remoteChangeObserver {
|
|
||||||
NotificationCenter.default.removeObserver(observer)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Observes CloudKit remote change notifications to auto-refresh UI when iCloud data syncs.
|
/// Observes CloudKit remote change notifications to auto-refresh UI when iCloud data syncs.
|
||||||
private func observeRemoteChanges() {
|
private func observeRemoteChanges() {
|
||||||
syncLogger.info("Starting CloudKit remote change observation")
|
cloudKitSyncManager.startObserving { [weak self] in
|
||||||
remoteChangeObserver = NotificationCenter.default.addObserver(
|
self?.handleRemoteStoreChange()
|
||||||
forName: .NSPersistentStoreRemoteChange,
|
|
||||||
object: nil,
|
|
||||||
queue: .main
|
|
||||||
) { [weak self] _ in
|
|
||||||
// Hop to the main actor and capture a strong reference safely there
|
|
||||||
Task { @MainActor [weak self] in
|
|
||||||
guard let strongSelf = self else { return }
|
|
||||||
strongSelf.handleRemoteStoreChange()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func handleRemoteStoreChange() {
|
private func handleRemoteStoreChange() {
|
||||||
remoteChangeEventCount += 1
|
let eventCount = cloudKitSyncManager.remoteChangeEventCount
|
||||||
lastRemoteChangeDate = now()
|
lastRemoteChangeDate = cloudKitSyncManager.lastRemoteChangeDate
|
||||||
// SwiftData may keep stale registered objects in long-lived contexts.
|
// SwiftData may keep stale registered objects in long-lived contexts.
|
||||||
// Recreate the context on remote store changes so fetches observe latest merged values.
|
// Recreate the context on remote store changes so fetches observe latest merged values.
|
||||||
modelContext = ModelContext(modelContainer)
|
modelContext = ModelContext(modelContainer)
|
||||||
syncLogger.info(
|
Design.debugLog("Received remote store change #\(eventCount); reloading rituals")
|
||||||
"Received remote store change #\(self.remoteChangeEventCount, privacy: .public); reloading rituals"
|
|
||||||
)
|
|
||||||
reloadRituals()
|
reloadRituals()
|
||||||
// Also refresh widgets when data arrives from other devices
|
// Also refresh widgets when data arrives from other devices
|
||||||
WidgetCenter.shared.reloadAllTimelines()
|
WidgetCenter.shared.reloadAllTimelines()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user