본문 바로가기

개발/Swift

[Swift] NS Coder로 간단한 Data 저장하기 (Data CRUD - 2)

공부하며 작성한 자료로, 덧붙일 점이나 사실과 다른 점이 있다면 언제든 좋은 지적 부탁드립니다.

NS Coder란?

NSCoder구체적인 하위 클래스가 메모리와 다른 형식 간에 객체 및 기타 값을 전송하는 데 사용하는 인터페이스를 선언합니다. 이 기능은 보관(디스크에 개체 및 데이터 저장) 및 배포(서로 다른 프로세스 또는 스레드 간에 개체 및 데이터 항목 복사)를 위한 기반을 제공합니다.

- Apple 개발자 문서 / Google 번역-

 

 

NSCoder로 데이터를 인코딩 및 디코딩 하여 저장하기.

struct, class로 직접 만든 데이터배열을 저장할 때는 NSCoder로 인코딩/디코딩하여 저장 할 수도 있습니다.

(DB를 따로 사용하지 않고 할 경우)

UserDefaults로 저장할 경우 비속성 관련 에러가 뜨면서 앱이 크러시됩니다.

인코딩 / 디코딩작업은 PropertyList Encoder/Decoder로 작업합니다.

 


 

0. 여기서 사용할 데이터모델 구조 (TodoModel)

// 데이터 구조
struct TodoModel: Codable {
    let title: String
    var isDone: Bool
}

1. 인코딩한 데이터를 저장할 URL 생성하기. (UserDefaults와 저장위치가 다름)

// print문으로 dataFilePath를 출력해보면 이곳에 인코딩한 데이터가 저장된다.
// dataFilePath의 타입은 URL? 이다.
let dataFilePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("items.plist")

 

2. 데이터 인코딩, 데이터 저장하기.

//MARK: - 데이터 저장하기
    func saveData() {
        // 1. 배열 데이터 인코딩
        let encoder = PropertyListEncoder()
        do {
            // 2. 데이터를 인코딩하고, dataFilePath에 저장하기.
            let data = try encoder.encode(self.myArray)
            try data.write(to: dataFilePath!)
        } catch {
            print("Encoding Error : \(error)")
        }
    }

 

3. 데이터 디코딩하기 (저장한 데이터 로드)

//MARK: - 데이터 로드하기
func loadData() {
  do {
      // 1. 데이터 가져오기
      let data = try Data(contentsOf: dataFilePath!)
      // 2. 데이터 디코딩하기.
      let decoder = PropertyListDecoder()
      let decodedData = try decoder.decode([TodoModel].self, from: data)
      // 3. 디코딩한 데이터 반영하기.
      myArray = decodedData
  } catch {
      print("Data load Error : \(error)")
  }
}

인코딩한 plist와 UserDefaults로 저장한 plist의 차이는 저장하는 타입에서 발생합니다.

  • 인코딩 → Array
  • UserDefaults → Dictionary

그러므로 NSCoder로 인코딩한 데이터는 어떤 배열이든 저장가능하지만, UserDefaults는 키-값 쌍이어야만 합니다.

 

저장 예시사진 (NSCoder)

반응형