- Use fully qualified enum names in default values (SnapshotQuality.complete) - Use raw string values for enum defaults to avoid circular dependencies - Mark createSnapshot @MainActor to satisfy Swift 6 Sendable requirements SwiftData models cannot cross async task boundaries in Swift 6, so any method that creates/modifies them must be on the main actor. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@@ -7,8 +7,8 @@ import SwiftData |
||
| 7 | 7 |
var snapshotID: UUID = UUID() |
| 8 | 8 |
var deltaID: UUID? |
| 9 | 9 |
var deviceID: String = "" |
| 10 |
- var anomalyTypeRaw: String = AnomalyType.deletion.rawValue |
|
| 11 |
- var severityRaw: String = Severity.info.rawValue |
|
| 10 |
+ var anomalyTypeRaw: String = "deletion" |
|
| 11 |
+ var severityRaw: String = "info" |
|
| 12 | 12 |
var typeIdentifier: String? |
| 13 | 13 |
var message: String = "" |
| 14 | 14 |
var isResolved: Bool = false |
@@ -11,7 +11,7 @@ import SwiftData |
||
| 11 | 11 |
var previousSnapshotID: UUID? |
| 12 | 12 |
var isChainStart: Bool = false |
| 13 | 13 |
var recoveredDeviceID: Bool = false |
| 14 |
- var snapshotQuality: SnapshotQuality = .complete |
|
| 14 |
+ var snapshotQuality: SnapshotQuality = SnapshotQuality.complete |
|
| 15 | 15 |
var anomalyFlagsJSON: String = "[]" |
| 16 | 16 |
var triggerReason: String = "manual" |
| 17 | 17 |
var isPostRestore: Bool = false |
@@ -9,7 +9,7 @@ import SwiftData |
||
| 9 | 9 |
var hash: String = "" |
| 10 | 10 |
var earliestDate: Date? |
| 11 | 11 |
var latestDate: Date? |
| 12 |
- var quality: SnapshotQuality = .complete |
|
| 12 |
+ var quality: SnapshotQuality = SnapshotQuality.complete |
|
| 13 | 13 |
var isUnsupported: Bool = false |
| 14 | 14 |
var snapshot: HealthSnapshot? |
| 15 | 15 |
@Relationship(deleteRule: .cascade, inverse: \YearlyCount.typeCount) |
@@ -10,8 +10,8 @@ import SwiftData |
||
| 10 | 10 |
var hashAfter: String = "" |
| 11 | 11 |
var qualityBeforeRaw: String? |
| 12 | 12 |
var qualityAfterRaw: String? |
| 13 |
- var transitionRaw: String = TypeTransition.unchanged.rawValue |
|
| 14 |
- var reasonRaw: String = TypeDeltaReason.normal.rawValue |
|
| 13 |
+ var transitionRaw: String = "unchanged" |
|
| 14 |
+ var reasonRaw: String = "normal" |
|
| 15 | 15 |
var yearlyCountNote: String = "" |
| 16 | 16 |
var isCloudKitImported: Bool = false |
| 17 | 17 |
var delta: SnapshotDelta? |
@@ -46,6 +46,7 @@ final class HealthKitService {
|
||
| 46 | 46 |
|
| 47 | 47 |
// MARK: - Snapshot creation |
| 48 | 48 |
|
| 49 |
+ @MainActor |
|
| 49 | 50 |
func createSnapshot(in context: ModelContext, selectedTypeIDs: Set<String>) async throws -> HealthSnapshot {
|
| 50 | 51 |
let active = Self.allTypes.filter { selectedTypeIDs.contains($0.id) }
|
| 51 | 52 |
let deviceResolution = KeychainService.resolveDeviceID(swiftDataStoreIsEmpty: isStoreEmpty(context: context)) |