iOS/iOS Swift Udemy - AngelaYu

Section19. 246) NSCoder로 데이터 인코딩/디코딩(save & load)

Developer-Michelle 2022. 10. 28. 22:17

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