스유 프로젝트를 진행하면서 아무 생각 없이 코어데이터 구조를 전부 구현했는데...
알고보니 스유에서는 코어데이터를 사용할 수 있는 방법이 따로 있었다...
복잡하게 뷰모델과 레파지토리를 통해서 fetch해오는 방법을 사용하지 않고 코어데이터를 불러올 수 있었다.
class CoreDataStack {
static let shared = CoreDataStack()
lazy private var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "MissionData")
container.loadPersistentStores(completionHandler: { (_, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
var context: NSManagedObjectContext {
return self.persistentContainer.viewContext
}
func save() {
if context.hasChanges {
do {
try context.save()
} catch {
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
}
}
struct Just3DaysApp: App {
let coreDataStack = CoreDataStack.shared
var body: some Scene {
WindowGroup {
Just3DaysMainView()
.environment(\.managedObjectContext,
coreDataStack.context)
}
}
}
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(entity: PresetData.entity(), sortDescriptors: [])
private var savedPresets: FetchedResults<PresetData>
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(entity: CurrentMissionsData.entity(),
sortDescriptors: [NSSortDescriptor(keyPath: \CurrentMissionsData.date, ascending: true)],
predicate: NSPredicate(format: "date == \(Date().toString())")
)
private var todaysMission: FetchedResults<CurrentMissionsData>
CurrentMission의 date가 오늘의 날짜와 같은 것을 필터링했다.
매번 패치해와서 사용하지 않아도 됐고..
수정도 간편했다. 그냥 엔티티의 데이터 자체에 바로 수정하면 되는것..?
자세히 공부해보지 않고 무작정 하던대로 코어데이터를 구현해서 프로젝트 속도에는 차질이 생겼지만, 또 새로운 것을 배우게 되었다.
그리고 앞으로는 제대로 공부해보고 시작하자는 교훈을 제대로 얻어버렸다.