본문 바로가기
💡 Today I Learned/개인 과제

[개인과제] 연락처 앱 만들기 3️⃣

by 솔비님 2024. 7. 19.

 

10.  CoreData에 정보 저장하기

강의에서 들은대로 데이터에 저장할 정보를 Entity에 넣어준다

 

name과 phoneNumber는 String 타입으로 넣어주고,

이미지는 사진 자체로 저장이 안 되기 때문에 Binary Data나 String으로 변환해 주어야 한다고 한다

 

 

먼저 이미지를 String 값으로 변환해 주기 위해 빈 배열을 하나 만들어 준다

 

그리고 가지고왔던 랜덤이미지 API를 String 값으로 반환해줄 tap() 클로저를 만들어 주고 만들어둔 빈 배열 imageUrl에 넣어준다

 

 

이제 사용자로부터 입력받은 name & phoneNumber 텍스트와 방금 String으로 변환한 이미지가

isEmpty를 통해 비었는지 검사하고 addView를 통해 coreData에 저장하는 과정이다

imageUrl을 addView 하지않는 이유
imageUrl 변수는 AddViewController 클래스의 인스턴스 변수로 선언되어 있어서 addView를 통해 접근할 필요가 없다 (직접 접근)
addView는 UI 요소를 담고 있는 커스텀 뷰이고, imageUrl은 컨트롤러에서 관리하는 데이터

 

 

그리고 saveData() 함수 실행 시 메인 컨트롤러(연락처 리스트)로 돌아갈 수 있도록 추가해 주었다

 

 


11.  CoreData를 이용하여 데이터 생성

강의에서 배운 내용대로 작성해 주었는데, 이 코드에 대해 이해가 잘 안되는 부분이 많아서 코드별로 따로 정리를 해 보았다

 

 

코드 설명 

 

1.  Entity 설정

func creatData(name: String, phoneNumber: String, profileImage: String) {
    guard let entity = NSEntityDescription.entity(forEntityName: PhoneBook.className, in: self.container.viewContext) else { return }

 

NSEntityDescription.entity(forEntityName:in:) 메서드를 사용하여 PhoneBook이라는 Entity를 가져오고, self.container.viewContext를 사용하여 CoreData의 메인 컨텍스트에서 작업하도록 설정

 


2.  NSManagedObject 생성 

    let newPhoneBook = NSManagedObject(entity: entity, insertInto: self.container.viewContext)

 

가져온 Entity를 기반으로 새로운 NSManagedObject를 생성

이 객체는 CoreData에서 관리하는 데이터 객체

 


3.  속성 설정

    newPhoneBook.setValue(name, forKey: PhoneBook.Key.name)
    newPhoneBook.setValue(phoneNumber, forKey: PhoneBook.Key.phoneNumber)
    newPhoneBook.setValue(profileImage, forKey: PhoneBook.Key.profileImage)

setValue(_:forKey:) 메서드를 사용하여 새로운 NSManagedObject에 값을 설정

각 속성에 대해 name, phoneNumber, profileImage 값이 설정되며,

여기서 PhoneBook.Key.xxx는 PhoneBook Entity의 각 속성에 대한 키 값이다

설정해 두었던 키값을 가져오는 것

 

[ 직접 입력하지 않고 키 값을 가져왔을 때의 장점 ]

1. 자동완성 기능 사용으로 오탈자 발생 확률이 줄어든다

2. 값 수정 시 모두 바꾸지 않고 해당 클래스 한 곳만 고치면 된다

 


4.  저장

    do {
        try self.container.viewContext.save()
        print("저장 성공")
    } catch {
        print("저장 실패")
    }
}

self.container.viewContext.save()를 호출하여 변경 사항을 CoreData에 저장

저장에 성공하면 "저장 성공"이 출력되고, 실패하면 catch 블록에서 "저장 실패"가 출력된다

 


12.  저장된 CoreData 테이블뷰로 가져오기

다음은 저장한 데이터를 불러와서 기존에 작업해 두었던 테이블뷰에 띄워야한다!

처음으로 할 것은 기존에 만들어 두었던 테이블뷰 셀의 수량을 저장된 데이터의 수에 맞게 띄울 수 있게 바꾸어주어야 한다

PhoneBook 데이터가 들어갈 빈 배열 phoneBookList를 만들어주었다

 

값을 phoneBookList의 수량만큼 return 할 수 있도록 바꾸어주었다

 

 

그 다음엔 저장된 데이터가 테이블뷰 cell에 올라올 수 있도록 해주어야 하는데

기존 만들어 두었던 테이블뷰 메서드를 약간 수정해 주었다

 

 

마지막으로 저장한 데이터를 모두 불러오는 readAllData() 메서드를 만들어 주었다

CoreData에서 데이터를 가져와서 만들어둔 빈 배열 phoneBookList에 저장하고 reloadData를 통해 테이블뷰를 새로고침한다

 

 

이 부분도 아직 헷갈려서 코드별로 따로 정리해 보았다

do {
      phoneBookList = try self.container.viewContext.fetch(PhoneBook.fetchRequest())
    }

 

self.container.viewContext.fetch 는 phoneBook Entity의 CoreData에서 데이터를 가져오는 함수다

가져와서 만들어둔 phoneBookList 배열에 저장한다

 

catch {
      print("데이터 읽기 실패")
    }

do 블록에서 오류가 발생하면 catch 블록으로 이동한다

 

 

기존에 내 파일에는 viewDidLoad만 있었는데, 해당 생명주기는 1회만 호출된다는 특징이 있다

그러므로, 데이터가 save 될 때마다 즉시 테이블뷰에 업데이트된 데이터가 보이려면 여러번 호출 가능한 viewWillAppear를 활용해 주어야 한다

 

viewWillAppear를 오버라이딩 하여 readAllData 메서드를 호출한다

이제 연락처 정보(데이터)를 저장하면 정상적으로 테이블뷰에 즉시 반영되는 모습을 볼 수 있다!