티스토리 뷰
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
'iOS' 카테고리의 다른 글
[iOS] LaunchScreen 설정 후 디바이스에만 나오지 않을때 (0) | 2022.04.05 |
---|---|
[Swift] Subscripts (서브스크립트) (0) | 2022.04.01 |
[iOS] URLSession (0) | 2022.03.27 |
[iOS] .contentMode (scaleToFill / scaleAspectFit / scaleAspectFill) (0) | 2022.03.25 |
[Swift] 메소드 Methods (0) | 2022.03.23 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- Swift Leetcode
- ios
- Swift ModernRIBs
- 원티드 프리온보딩
- Combine: Asynchronous Programming with Swift
- RTCCameraVideoCapturer
- CS 네트워크
- Swift 프로그래머스
- RIBs tutorial
- swift (programmers)
- Swift joined
- Class
- Swift Error Handling
- Swift init
- Swift joined()
- swift programmers
- Swift inout
- Swift 내림차순
- Swift
- Swift 프로퍼티
- iOS error
- 2023년 회고
- swift property
- swift protocol
- Swift 알고리즘
- Swift RIBs
- Swift final
- removeLast()
- swift reduce
- swift 고차함수
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함