티스토리 뷰

728x90

알람 부분을 구현하는 중에 아래의 프로퍼티들을 담은 Alarm 이라는 객체를 만들어 UserDefaults에 저장하려고 합니다.

// Alarm.swift

struct Alarm: Codable, Equatable {
    let alarmTable: String
    let alarmMeridiem: String
    let alarmTimes: String
}

아하! 저번에 UserDefaults 때 값 저장, 불러오기는 아래 처럼 하면 된다했었지 !

 

 

그럼 이렇게 값저장 하면 되겠네 !

.

.

.

 

응 안돼 ~

 

 

 

 

 

 

객체를 저장할때는 조금 다른 방식으로 합니다. 

바로 PropertyListEncode, PropertyListDecode를 활용하는데요.

 

간단하게 Encode, Decode의 개념에 대해 알아보고 갈게요

Encode
  - 데이터를 '기기 (디바이스)'가 알아볼 수 있게 변환 하는 작업.

Decode
  - 데이터를 '사람'이 알아볼 수 있게 변환 하는 작업.

 

 

먼저 값 저장 방법 입니다. 

기기 (디바이스)가 알아볼 수 있게 PropertyListEncoder를 이용해 encode를 해줍니다.

이런 형태로 저장하시고,

PropertyListEncoder().encode( 저장할 값 ), forKey: "key 이름"

 

아래는 활용 예제입니다.

// 참고

// alarmVC.alarms += [저장된 Alarm]  ex) "오후 10:10
// guard let alarmVC = self.presentingViewController as? AlarmViewController else { return } 
//    ... 


UserDefaults.standard.set(try? PropertyListEncoder().encode(alarmVC.alarms), forKey: "alarms")

 

 

불러오는 방법도 알아봐야겠죠.

저장 방식과 반대로 Encode (기기가 알아듣게 저장)를  했으니 Decode (사람이 알아보게 불러오기) 를 해야합니다.

이런 형태로 불러오시면 되며,

guard let savedData = defaults.value(forKey: "저장했었던 key") as? Data,
            let loadAlarms = try? PropertyListDecoder().decode(어떤형태로 변환할건지(타입), from: decode할 데이터) else { return [] }
            return loadAlarms

 

아래는 활용 예제입니다.

// AlarmViewController.swift

// AddAlarmViewController.swift 에서 '알람저장'을 하면 화면이 닫힘과 동시에 AlarmViewController의 viewWillAppear가 호출됩니다. 
override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        alarms = loadAllAlarms()
        
    }

private func loadAllAlarms() -> [Alarm] {
        guard let savedData = defaults.value(forKey: "alarms") as? Data,
            let loadAlarms = try? PropertyListDecoder().decode([Alarm].self, from: savedData) else { return [] }
            return loadAlarms
        
    }

 

 

이렇게하면 저장했던 데이터를 불러와 alarms의 배열에 추가해 줍니다!!!


오늘은 UserDefaults를 사용해서 객체를 저장하는 방법을 알아봤습니다. 

이런 데이터들을 로컬에 저장하는 더 좋은 방법이 있을거 같네요. 

사용은 해보지 않았지만 CoreData, Realm 으로도 저장할 수 있는걸로 알고있는데 

추후 공부해보고 블로깅 해보도록 하겠습니다~ 

728x90