A couple of articles that I have read suggest that I get CoreData records from my DataManager like the following. It's kind of redundant as it accesses DataManager inside the TimelineProvider struct and also inside the Widget struct. That's why I wonder if this is the right approach.
import WidgetKit
import SwiftUI
import CoreData
struct Provider: TimelineProvider {
func placeholder(in context: Context) -> SimpleEntry {
...
}
func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
...
}
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
let manager = CloudDataManager()
var records: [Little] = []
let request = NSFetchRequest<Little>(entityName: "Little")
do {
records = try manager.context.fetch(request)
records.sort { lhs, rhs in
lhs.trashDate! < rhs.trashDate!
}
} catch {
print("Fetch error for CloudDataManager: \(error.localizedDescription)")
}
var items: [Item] = []
for record in records {
let item = Item(trashDate: record.trashDate ?? Date.now, imageSelection: Int(record.imageSelection))
items.append(item)
}
let entry = Timeline(entries: [SimpleEntry(date: Date(), items: items)], policy: .atEnd)
completion(entry)
}
}
struct SimpleEntry: TimelineEntry {
let date: Date
let items: [Item]
}
struct LittleGuyEntryView : View {
var entry: Provider.Entry
var body: some View {
ZStack {
ContainerRelativeShape()
.fill(.widgetBackground)
VStack {
if entry.items.count > 0 {
ForEach(entry.items, id: \.id) { item in
...
}
}
}
.padding()
}
}
}
struct LittleGuy: Widget {
let manager = DataManager()
let kind: String = "App name"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider()) { entry in
LittleTrashEntryView(entry: entry)
.environment(\.managedObjectContext, manager.context)
.containerBackground(.fill.tertiary, for: .widget)
}
.contentMarginsDisabled()
.supportedFamilies([.systemSmall])
}
}