공부하며 작성한 자료로, 덧붙일 점이나 사실과 다른 점이 있다면 언제든 좋은 지적 부탁드립니다.
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)
반응형
'개발 > Swift' 카테고리의 다른 글
[Swift] 라이트 모드 또는 다크모드 고정하기 (0) | 2022.08.08 |
---|---|
[Swift] Storyboard 없이 앱 만들기 (UIKit) (0) | 2022.08.03 |
[Swift] UserDefaults로 간단한 데이터 저장하기 (Data CRUD - 1) (0) | 2022.07.14 |
[Swift] 타이머 생성하기 (0) | 2022.07.12 |
[Swift] TableView Header 만들기 (0) | 2022.07.06 |