wip
This commit is contained in:
33
Workouts/Schema/CloudKitSyncObserver.swift
Normal file
33
Workouts/Schema/CloudKitSyncObserver.swift
Normal file
@ -0,0 +1,33 @@
|
||||
import SwiftUI
|
||||
import SwiftData
|
||||
|
||||
/// A view modifier that refreshes the view when CloudKit data changes
|
||||
struct CloudKitSyncObserver: ViewModifier {
|
||||
@Environment(\.modelContext) private var modelContext
|
||||
@State private var refreshID = UUID()
|
||||
|
||||
func body(content: Content) -> some View {
|
||||
content
|
||||
.id(refreshID) // Force view refresh when this changes
|
||||
.onReceive(NotificationCenter.default.publisher(for: .cloudKitDataDidChange)) { _ in
|
||||
// When we receive a notification that CloudKit data changed:
|
||||
// 1. Create a new UUID to force view refresh
|
||||
refreshID = UUID()
|
||||
|
||||
// 2. Optionally, you can also manually refresh the model context
|
||||
// This is sometimes needed for complex relationships
|
||||
Task { @MainActor in
|
||||
try? modelContext.fetch(FetchDescriptor<Exercise>())
|
||||
// Add other model types as needed
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Extension to make it easier to use the modifier
|
||||
extension View {
|
||||
/// Adds observation for CloudKit sync changes and refreshes the view when changes occur
|
||||
func observeCloudKitChanges() -> some View {
|
||||
self.modifier(CloudKitSyncObserver())
|
||||
}
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
import Foundation
|
||||
import SwiftData
|
||||
|
||||
struct InitialData {
|
||||
struct DataLoader {
|
||||
static let logger = AppLogger(
|
||||
subsystem: Bundle.main.bundleIdentifier ?? "dev.rzen.indie.Workouts",
|
||||
category: "InitialData"
|
@ -2,21 +2,15 @@ import Foundation
|
||||
import SwiftData
|
||||
|
||||
final class WorkoutsContainer {
|
||||
static let logger = AppLogger(subsystem: "Workouts", category: "WorkoutsContainer")
|
||||
static let logger = AppLogger(
|
||||
subsystem: Bundle.main.bundleIdentifier ?? "dev.rzen.indie.Workouts",
|
||||
category: "WorkoutsContainer"
|
||||
)
|
||||
|
||||
static func create(shouldCreateDefaults: inout Bool) -> ModelContainer {
|
||||
static func create() -> ModelContainer {
|
||||
let schema = Schema(versionedSchema: SchemaV1.self)
|
||||
let configuration = ModelConfiguration(cloudKitDatabase: .automatic)
|
||||
let container = try! ModelContainer(for: schema, migrationPlan: WorkoutsMigrationPlan.self, configurations: [configuration])
|
||||
|
||||
let context = ModelContext(container)
|
||||
let descriptor = FetchDescriptor<Exercise>()
|
||||
let results = try! context.fetch(descriptor)
|
||||
|
||||
if results.isEmpty {
|
||||
shouldCreateDefaults = true
|
||||
}
|
||||
|
||||
return container
|
||||
}
|
||||
|
||||
@ -30,7 +24,7 @@ final class WorkoutsContainer {
|
||||
let context = ModelContext(container)
|
||||
|
||||
// Create default data for previews
|
||||
InitialData.create(modelContext: context)
|
||||
DataLoader.create(modelContext: context)
|
||||
|
||||
return container
|
||||
} catch {
|
||||
|
Reference in New Issue
Block a user