Section19. 246) NSCoder로 데이터 인코딩/디코딩하기
iOS sandbox 방식을 이용해서 Documents에 많은 정보를 저장하고 불러오는 방식.
즉, documents -> Info.plist에 저장하는 방식으로 하는 방법임
(사용자 커스텀 및 다양, 많은 정보 저장할 때 이용하는 방법 중 하나) - NSCoder.
(UserDefaults로는 소소한 정보만을 저장할 뿐 사용자 커스텀 등 방대한 정보를 저장하지는 말자.)
데이터를 인코딩한다? = 본질적으로 한 데이터 유형을 다른 데이터유형으로 변환하는 것.
ex) 음악 -> Encoder -> 비닐디스크
ex) 비닐디스크 -> Decoder -> 음악
func saveItems() => 사용자 정의 개체의 배열을 plist에 쓸 수 있는 데이터로 만든 다음, (인코더 통해서)
func loadItems() => 해당 데이터가 필요할 때, 항목 배열의 형태로 해당 데이터를 가져온다. (디코더 통해서)
var itemArray = [Item]()
//document 파일 저장 경로
let dataFilePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("Items.plist")
-> itemArray 라는 배열을 저장하고 검색할 수 있는 "Items.plist" plist 파일로 변환함 (인코딩)
func saveItems() {
let encoder = PropertyListEncoder()
do {
let data = try encoder.encode(itemArray)
try data.write(to: dataFilePath!)
} catch {
print("Error encoding item array, \(error)")
}
self.tableView.reloadData()
}
할일 (To do list) 앱에서
addButtonPressed 할 때, tableView에서 didSelectRowAt 할 때
각각 모두 saveItems() 를 호출해야 실시간으로 할일 목록 및 Bool타입의 체크리스트가 반영되는 것을 확인할 수 있었다.
func loadItems() {
if let data = try? Data(contentsOf: dataFilePath!) {
let decoder = PropertyListDecoder()
do {
itemArray = try decoder.decode([Item].self, from: data)
} catch {
print("items: Any...")
}
}
정리하자면,
saveItems() => itemsArray -> Encoder -> info.plist
loadItems() => info.plist -> Decoder -> itemsArray에서 필요한 배열 꺼내온다.
다만, 이 전체 TodoListVC.swift 에서 사용한 Item.swift 파일에서, encoder, decoder 쓰고자 할 때 거기에다가 프로토콜 선언을 해주어야 함.
=>
class Item: Codable {
var title: String = ""
var done: Bool = false
}
Codable = Encodable, Decodable 모두 포괄.
'iOS > iOS Swift Udemy - AngelaYu' 카테고리의 다른 글
Section19. 249) CoreData (0) | 2022.10.29 |
---|---|
Section19. 248) 데이터베이스 소개 (0) | 2022.10.29 |
Debug with breakpoint (0) | 2022.10.26 |
iOS swift TableView - table cells must have reuse identifiers (0) | 2022.10.25 |
디버깅 5단계 (0) | 2022.10.24 |