I’m utilizing CoreData with CloudKit to store workout data in SwiftUI for the watch app. However, when a new data entry is stored in the WorkoutLogItemDetailView and I return to the CurrentLogView, it takes some time – a few seconds to a minute – for the updated data to appear on the ScrollView.
To be honest, I’m a bit puzzled by the FetchRequest mechanism. How can I adjust my code to ensure that data is fetched immediately when the view loads?
struct CurrentLogView: View {
@Binding var selectedLog: CDLog?
@Environment(.managedObjectContext) var context
@FetchRequest(fetchRequest: CDLogItem.fetch(), animation: .bouncy) var logItems
init (viewSelector: Binding<TargetView>, selectedLog: Binding<CDLog?>) {
self._selectedLog = selectedLog
var request = CDLogItem.fetch()
request.predicate = NSPredicate(format: "log == %@", selectedLog.wrappedValue! as CVarArg)
self._logItems = FetchRequest(fetchRequest: request)
}
private var groupedLogItems: [GroupedLogItems] {
// I create a new array from the fetched logItems
}
var body: some View {
ScrollView() {
ForEach(groupedLogItems, id: .id) { group in
// load logItems
}
}
.toolbar {
ToolbarItemGroup(placement: .bottomBar) {
// navigate to view where new data is stored
NavigationLink(destination: WorkoutLogItemDetailView(selectedWorkout: selectedGroup.workoutName, selectedLog: selectedLog)) {
Image(systemName:"record.circle.fill")
}
}
}
}
}
extension CDLogItem {
static func fetch(_ predicate: NSPredicate = .all) -> NSFetchRequest<CDLogItem> {
let request = CDLogItem.fetchRequest()
request.sortDescriptors = [NSSortDescriptor(keyPath: CDLogItem.orderId_, ascending: true),
NSSortDescriptor(keyPath: CDLogItem.uuid_, ascending: false)]
request.predicate = predicate
return request
}
}