A dashboard screen lists cameras from a @Query. Each row is a child view that holds the model instance:
@Query(filter: #Predicate<CameraModel> { $0.device?.isSelected == true }) private var cameras: [CameraModel]
List {
ForEach(cameras) { camera in
CameraCellView(camera: camera) //holds let camera: CameraModel
}
}
The row reads model attributes in its body (camera.name, camera.cameraType, camera.thumbnailData). It also has a 1-second timer that updates a "last snapshot" subtitle, so it redraws on its own.
A settings screen is pushed on top of the dashboard in the same NavigationStack. It deletes a camera like this:
camera.modelContext?.delete(camera) try? camera.modelContext?.save()
Immediately after the delete, the app crashes in the dashboard row's body when it reads an attribute:
Fatal error: This backing data was detached from a context without resolving attribute faults: PersistentIdentifier(...) - \CameraModel.cameraType
This is not 100% reproducible.
The whole error message is: Thread 1: Fatal error: This backing data was detached from a context without resolving attribute faults: PersistentIdentifier(id: SwiftData.PersistentIdentifier.ID(backing: SwiftData.PersistentIdentifier.PersistentIdentifierBacking.managedObjectID(0x8f8ff6c009fee652 <x-coredata://65230C45-6F86-4B64-AEAB-6AAA9CB72D24/CameraModel/p16>))) - \CameraModel.cameraType
I understand this is due to a small gap where the SwiftUI view is rerendered before Query updates the view because of the deletion and the SwiftUI view points at a nonexistent SwiftData record. I'm just wondering what's a good way of avoiding that? SwiftData is used project-wide so this can potentially happen on nearly every view.