Apple Developer Documentation

앱의 로컬 저장 위치를 찾고 해당 위치에 파일을 생성하고

해당 파일에 커스텀 클래스를 (모델) 인코더해서 json으로 가능하게 만들어주고 저장시킨다.

<aside> 💡 .plist = property list

</aside>

Overview

예를 들면, 음악을 인코딩를 하면 특정 데이터파일이 만들어지고, 해당 데이터를 디코딩하면 들을 수 있는 음악으로 만들어지다.

FileManager

let dataFilePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
print(dataFilePath)
//users home directory

encode to plist

let dataFilePath = FileManager.default.urls(for: .documentDirectory, in: 
	.userDomainMask).first?.appendingPathComponent("Items.plist")

...
//in model add protocol
class Model: encodable {...}
...
//1. 저장하고 싶은 데이터를 인코딩한다.
//2. write함수로 지정 경로에 데이터를 쓰기(write)한다.

func savedItem() {
    // MARK: - NSCoder Plist encoder!
    let encoder = PropertyListEncoder()
    
    do {
        let data = try encoder.encode(itemArray)
        try data.write(to: dataFilePath!)
    } catch {
        print("encode error \\(error)")
    }
    tableView.reloadData()
}

how to decode plist file

위에서 커스텀 클래스를 인코딩해서 plist파일에 집어넣었다. 그렇다면 그렇게 만들어진 파일을 내 앱으로 불러오는 방법은?

class Model: encodable, decodable {...}
...
func loadItem() {
    do {
        let data = try Data(contentsOf: dataFilePath!)
        let decoder = PropertyListDecoder()
        itemArray = try decoder.decode([Item].self, from: data)
    } catch {
        print("encode error \\(error)")
    }   
}

<aside> 💡 Encodable + Decodable = Codable 👏

</aside>

<aside> 💡 plist에 들어있는 하나의 item을 가져오기 위해서는 전체 파일을 전부 로드해야되기 때문에, 많은 양의 데이터를 처리하는데 적합하지 않다.

</aside>

vs UserDefault