ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • UserDefaults을 이용하여 로컬에 데이터 저장하기(2) - Encoder & Decoder
    데이터 저장/데이터 저장 in 로컬 : UserDefaults 2022. 8. 18. 11:36

     

     

     

     

     

     

    이전에 userDefaults에 데이터를 저장하면서 타입캐스팅 방식을 이용했는데,

     

    사실, userDefaults에 저장할 데이터로서 적정한 것들이라면 타입캐스팅까지도 필요하지 않을 것이란 생각이 든다.

     

     

     

     

     

    그래도 아직 다른 저장방식을 배우지 않은 상태에서 예제를 계속 하다 보니 타입캐스팅이 까다롭다고 느껴졌고,

     

    그러다 강의에서 배웠던 JsonEncoder & Decoder가 생각나서 시도해봤는데 잘 되었다.

     

    그래서 검색을 해보니 인코딩&디코딩에 JSON과 Property list 두 가지 방식이 있었다.

     

    방법은 거의 동일해서 

     

    그 방식을 간단하게 정리해보면

     

     

     

     

     

    우선 첫번째는 저장할 데이터의 타입을 Codable로 선언해야 한다.

    struct NewAlram: Codable {
        var id = ""
        let date: Date
        var isOn: Bool
        }

    Codable을 encode와 decode가 모두 가능하다.

     

     

     

     

     

    이제 userDefaults에 저장할 데이터를 만들어 보면 아래와 같이 한 줄로 끝이다.

     func saveLocalData() {
            let userDefaults = UserDefaults.standard     
            
            let data = try? JSONEncoder().encode(alramList)
            userDefaults.set(data, forKey: "alramList")
            
        }

    저장된 데이터를 불러올 때도 한 줄로 끝이다.

    func loadLocalData() {
            let userDefaults = UserDefaults.standard
            
            guard
                let data = userDefaults.data(forKey: "alramList"),
                let savedData = try? JSONDecoder().decode([NewAlram].self, from: data) else { return }
            
            self.alramList = savedData
            
        }

     

     

     

     

     

     

    타입캐스팅 방식과 비교해보면

     

    1. 저장

    A. 타입 캐스팅

      let data = alramList.map {
                [
                    "id": $0.id,
                    "date": $0.date,
                    "isOn": $0.isOn
                ]
            }

    B. Json

    let data = try? JSONEncoder().encode(alramList)

    C. PropertyList

    let data = try? PropertyListEncoder().encode(alramList)

     

     

     

     

     

    2. 로드

    A. 타입캐스팅

     func loadLocalData() {
            let userDefaults = UserDefaults.standard
            guard let data = userDefaults.array(forKey: "alramList") as? [[String: Any]] else { return }
            alramList = data.compactMap {
                guard let id = $0["id"] as? String  else { return nil }
                guard let date = $0["date"] as? Date else { return nil }
                guard let isOn = $0["isOn"] as? Bool else { return nil }
                return NewAlram(date: date, isOn: isOn)
            }
    }

    B. Json

    guard
        let data = userDefaults.data(forKey: "alramList"),
        let savedData = try? JSONDecoder().decode([NewAlram].self, from: data) else { return }
    self.alramList = savedData

    C. PropertyList

    guard
        let data = userDefaults.data(forKey: "alramList"),
        let savedData = try? PropertyListDecoder().decode([NewAlram].self, from: data) else { return }
    self.alramList = savedData

     

    userDefaults에 저장할 데이터가 타입캐스팅이 필요한 정도라면 codable 방식을 쓰는 게 나을 것 같다.

     

Designed by Tistory.