[SwiftUI] (삽질예정)CoreData 사용과 필터링

호랭이·2022년 8월 23일
0

🍎 SwiftUI

목록 보기
1/6

스유 프로젝트를 진행하면서 아무 생각 없이 코어데이터 구조를 전부 구현했는데...
알고보니 스유에서는 코어데이터를 사용할 수 있는 방법이 따로 있었다...
복잡하게 뷰모델과 레파지토리를 통해서 fetch해오는 방법을 사용하지 않고 코어데이터를 불러올 수 있었다.

1. 기존의 Swift에서 흔히 하는 방식대로 엔티티와 코어데이터모델을 생성

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)")
            }
        }
    }
}

2. App파일에서 environment

struct Just3DaysApp: App {
    let coreDataStack = CoreDataStack.shared
    
    var body: some Scene {
        WindowGroup {
            Just3DaysMainView()
                .environment(\.managedObjectContext,
                              coreDataStack.context)
        }
    }
}

3. 뷰에서 사용

    @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가 오늘의 날짜와 같은 것을 필터링했다.

.

매번 패치해와서 사용하지 않아도 됐고..
수정도 간편했다. 그냥 엔티티의 데이터 자체에 바로 수정하면 되는것..?
자세히 공부해보지 않고 무작정 하던대로 코어데이터를 구현해서 프로젝트 속도에는 차질이 생겼지만, 또 새로운 것을 배우게 되었다.
그리고 앞으로는 제대로 공부해보고 시작하자는 교훈을 제대로 얻어버렸다.

❌ 아직 갈아엎는중이라서 이 글은 정확하지 않은 정보일 수 있음을 유의해주세요❌

profile
삐약

0개의 댓글