일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Timer
- App Store Connect
- CLLocationManagerDelegate
- Required Reason API
- swift
- SwiftUI Boolean 값
- 한국어 개인정보처리방침
- weatherKit
- AnyObject
- font book
- xcode로 날씨앱 만들기
- 클로저의 캡슐화
- Startign Assignments
- CoreLocation
- dispatchsource
- WeatherManager
- weak var
- Xcode
- 영문 개인정보처리방침
- 단일 책임원칙
- 러닝타이머
- MKMapViewDelegate
- MKMapItem
- UICollectionViewFlowLayout
- UIAlertAction
- Protocol
- 서체관리자
- 러닝기록앱
- addannotation
- RunningTimer
- Today
- Total
VesselWheel
UserDefaults를 이용한 데이터 관리와 ToDo 앱 만들기 본문
공식문서
https://developer.apple.com/documentation/foundation/userdefaults
UserDefaults란?
- UserDefaults는 간단한 Key-Value 데이터를 저장하는데 사용됩니다.
- 주로 설정 값이나 사용자 기본 설정과 같은 작은 데이터를 저장할 때 사용됩니다.
- 여기서 key값은 꼭 String 타입이여야 합니다.
// 데이터 추가 및 업데이트
UserDefaults.standard.set(value, forKey: key)
// 데이터 조회 | Any? 타입이여서 as를 사용한 타입 변환 후 사용
UserDefaults.standard.value(forKey: key)
// 데이터 조회 | 특정 타입으로 반환할 경우 (String)
UserDefaults.standard.string(forKey: key)
// 데이터 삭제
UserDefaults.standard.removeObject(forKey: key)
standard란?
standard은 UserDefaults 클래스의 정적 속성입니다.
UserDefaults 클래스는 iOS 앱에서 사용자 설정과 같은 간단한 데이터를 영구적으로 저장하고 검색하는 데 사용됩니다. standard는 기본 UserDefaults 객체에 대한 접근을 제공합니다.
앱의 다른 부분에서 UserDefaults에 접근하려면 standard를 사용하여 기본 객체에 접근하고, 해당 객체를 통해 데이터를 저장하고 검색합니다.
DataManager 클래스에서 싱글톤 패턴을 적용한 코드
//
// DataManager.swift
// ToDowithData
//
// Created by Jason Yang on 1/9/24.
//
import UIKit
struct UserDefaultsKeys {
static let todoList = "todoList"
}
class DataManager: NSObject {
static let shared = DataManager()
private override init() {
super.init()
}
func setData() {
// 프로퍼티 배열 생성
let todos : [RemoteTodo] = [
RemoteTodo(id: 0, title: "title1", isCompleted: false, category: "운동"),
RemoteTodo(id: 1, title: "title2", isCompleted: false, category: "운동"),
RemoteTodo(id: 2, title: "title3", isCompleted: false, category: "생활"),
RemoteTodo(id: 3, title: "title4", isCompleted: false, category: "생활")
]
saveData(todos)
}
func saveData(_ todos: [RemoteTodo]) {
// JASON형식으로 인코딩된 데이터를 UserDefaults에 저장, 이렇게 하면 ToDo 목록이 앱이 종료되어도 유지됨.
let encoder = JSONEncoder()
do {
let encodedData = try encoder.encode(todos)
UserDefaults.standard.set(encodedData, forKey: UserDefaultsKeys.todoList)
} catch {
print("Failed to save todos: \(error.localizedDescription)")
}
}
// 디코딩된 데이터를 ToDo 객체 배열로 반환
// UserDefaults에서 저장된 데이터를 가져와서 디코딩하여 RemoteTodo 객체의 배열로 반환
func getData() -> [RemoteTodo] {
if let encodedData = UserDefaults.standard.data(forKey: UserDefaultsKeys.todoList) {
let decoder = JSONDecoder()
do {
let decodedData = try decoder.decode([RemoteTodo].self, from: encodedData)
return decodedData
} catch {
print("Failed to load todos: \(error.localizedDescription)")
}
}
// 데이터 불러오기 실패 시 빈 배열 반환
return []
}
// 업데이트된 ToDo 목록을 인코딩하여 UserDefaults에 저장, 기존 데이터를 덮어쓰는 역할
func updateData(with updatedList: [RemoteTodo]) {
let encoder = JSONEncoder()
do {
let encodedData = try encoder.encode(updatedList)
UserDefaults.standard.set(encodedData, forKey: UserDefaultsKeys.todoList)
} catch {
print("Failed to update todos: \(error.localizedDescription)")
}
}
// "todoList" 키에 해당하는 데이터 삭제, removeOject 매소드 사용
func deleteData() {
UserDefaults.standard.removeObject(forKey: "todoList")
}
}
해석
DataManager 클래스는 UserDefaults를 사용하여 데이터를 저장, 로드, 업데이트 및 삭제하는 기능을 제공합니다.
UserDefaults는 앱에서 간단한 데이터를 영구적으로 저장하는 데 사용되는 인터페이스입니다.
이 클래스에서는 다음과 같은 메서드들이 제공됩니다:
1. `setData()`: 프로퍼티 배열을 생성하고, 해당 데이터를 saveData 메서드를 통해 UserDefaults에 저장합니다. 이 메서드는 초기 데이터를 설정하는 데 사용될 수 있습니다.
2. `saveData(_ todos: [RemoteTodo])`: 주어진 RemoteTodo 배열을 JSON 형식으로 인코딩하고, UserDefaults에 저장합니다. 이를 통해 앱이 종료되어도 ToDo 목록이 유지될 수 있습니다.
3. `getData() -> [RemoteTodo]`: UserDefaults에서 저장된 데이터를 가져와서 디코딩하여 RemoteTodo 객체의 배열로 반환합니다. 이를 통해 이전에 저장된 ToDo 목록을 로드할 수 있습니다.
4. `updateData(with updatedList: [RemoteTodo])`: 주어진 업데이트된 ToDo 목록을 인코딩하여 UserDefaults에 저장합니다.
이를 통해 기존 데이터를 덮어쓸 수 있습니다.
5. `deleteData()`: "todoList" 키에 해당하는 데이터를 UserDefaults에서 삭제합니다. UserDefaults는 간단한 데이터를 저장하기에 적합한 방법이지만, 대량의 데이터나 복잡한 데이터 구조를 저장하기에는 적합하지 않습니다. 이 경우에는 CoreData, SQLite 또는 서버 기반의 데이터베이스와 같은 다른 데이터 저장 방법을 고려해야 합니다.
또한, 이 코드에서는 UserDefaultsKeys 구조체를 사용하여 "todoList" 키를 정의하고 있습니다. 이를 통해 오타나 중복을 방지하고, 키를 일관성 있게 사용할 수 있습니다.
'Xcode Study' 카테고리의 다른 글
setValue 함수 (0) | 2024.01.18 |
---|---|
xcode 협업을 위한 storyboard 분할하기(feat. storyboard reference) (0) | 2024.01.16 |
Swift에서의 네트워크 통신 이해하기(.feat Decodabe, Encodable, Codable)(2/2) (0) | 2024.01.04 |
Swift에서의 네트워크 통신 이해하기(.feat URL Session)(1/2) (0) | 2024.01.04 |
Code로 쓰는 UI와 StroyBoard 로 쓰는 UI의 장점과 단점(from. 권영호 튜터) (0) | 2024.01.04 |