앱의 로컬 저장 위치를 찾고 해당 위치에 파일을 생성하고
해당 파일에 커스텀 클래스를 (모델) 인코더해서 json으로 가능하게 만들어주고 저장시킨다.
<aside> 💡 .plist = property list
</aside>
예를 들면, 음악을 인코딩를 하면 특정 데이터파일이 만들어지고, 해당 데이터를 디코딩하면 들을 수 있는 음악으로 만들어지다.
let dataFilePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
print(dataFilePath)
//users home directory
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()
}
위에서 커스텀 클래스를 인코딩해서 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>