개발하는 동글 :]

[TIL],[TRY],[UIKit],[CoreData사용해보기][0] 본문

카테고리 없음

[TIL],[TRY],[UIKit],[CoreData사용해보기][0]

동글하다 2023. 9. 13. 23:53

1. 목표?

일단 구현한 후 코드를 이해하는 것을 목표로 CoreData를 사용해보자.

2. 구현

2.1 CoreData의 Model 만들기

먼저 새롭게 CoreData의 Data Model 파일을 만들어준 뒤 Entities를 새롭게 하나 만들어서 원하는 속성들을 만들어준다.

2.2 AppDelegate파일 수정

    //AppDelegate
    // MARK: - Core Data stack

    lazy var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "MyToDoApp_3")
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()

    // MARK: - Core Data Saving support

    // 임시저장소의 내용을 저장하는 메서드 (변화가 있다면 ===> 저장)
    func saveContext() {
        let context = persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {
                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            }
        }
    }

그 후 AppDelegate 파일에 해당 내용을 추가해 준다.

2.3 CoreDataManager 만들기

final class CoreDataManager{
    
    static let shared = CoreDataManager()
    private init() {}
    
    let appDelegate = UIApplication.shared.delegate as? AppDelegate
    
    lazy var context = appDelegate?.persistentContainer.viewContext
    
    let modelName: String = "ToDoData"
    
    // MARK: - [Read] 코어데이터에 저장된 데이터 모두 읽어오기
    func getToDoListFromCoreData() -> [ToDoData] {
        var toDoList: [ToDoData] = []
        // 임시저장소 있는지 확인
        if let context = context {
            // 요청서
            let request = NSFetchRequest<NSManagedObject>(entityName: self.modelName)
            
            do {
                // 임시저장소에서 (요청서를 통해서) 데이터 가져오기 (fetch메서드)
                if let fetchedToDoList = try context.fetch(request) as? [ToDoData] {
                    toDoList = fetchedToDoList
                }
            } catch {
                print("가져오는 것 실패")
            }
        }
        
        return toDoList
    }
    // MARK: - [Create] 코어데이터에 데이터 생성하기
    func saveToDoData(toDoText: String?, tag: Int16, completion: @escaping () -> Void) {
        // 임시저장소 있는지 확인
        if let context = context {
            // 임시저장소에 있는 데이터를 그려줄 형태 파악하기
            if let entity = NSEntityDescription.entity(forEntityName: self.modelName, in: context) {

                // 임시저장소에 올라가게 할 객체만들기 (NSManagedObject ===> ToDoData)
                if let toDoData = NSManagedObject(entity: entity, insertInto: context) as? ToDoData {

                    // MARK: - ToDoData에 실제 데이터 할당
                    toDoData.context = toDoText
                    toDoData.isDone = false
                    toDoData.id = UUID()
                    toDoData.tag = tag

                    //appDelegate?.saveContext() // 앱델리게이트의 메서드로 해도됨
                    if context.hasChanges {
                        do {
                            try context.save()
                            completion()
                        } catch {
                            print(error)
                            completion()
                        }
                    }
                }
            }
        }
        completion()
    }
 
}

3. 실행 확인

 

4. TIL

4.1 오늘의 회고

1. 새로운 과제를 시작하며 조금더 반복되는 코드를 줄여보고자 고민을 하던 부분을 buttonTapped이벤트를 한 메서드로 묶어 switch문을 이용하여 코드를 줄여보았다. 아직은 좋은 코드인지는 모르겠지만 앞으로도 좀 더 줄일수 있는 부분은 줄여가며 코드를 작성하는 것을 유지해 보자.

2. CoreData를 공부해보며 구현해 보았다. 현재까지는 데이터를 읽어 오는 것과 저장하는 것까지 구현한 상태이다. 하지만 코드의 내용을 알지 못하고 단순 구현만 하였기에 내용을 이해하기 위한 공부를 해보자.

3. TIL을 나의 성장과정을 담는 것을 목표로 하자. 지금까지는 블로그에 글을 정보를 전달하는 것에 의미를 둔 것 같다. 앞으로는 오늘 처럼 나의 생각과 내가 한 시도들을 꾸준히 기록해 보자.

4.2 내일의 목표

1. CoreData CRUD 구현 완료하기

2. CoreData 부분 코드 공부해서 이해해 보기

3. 알고리즘 1문제