๋์ ๋์ (์ด ๋ด์ฉ์ ๋๊ฒจ๋ ๋ผ์)
์์ฃผ ์ค๋ ์ ์, iOS์ ๋ฐฐํฌ ๊ณผ์ ์ด ๊ถ๊ธํ์ฌ ์์ฃผ ๊ฐ๋จํ ์ฑ์ ์ถ์ํด ๋ณธ ์ ์ด ์๋ค.
์ต๊ทผ ํฌํด ์ ๋ฆฌ๋ ํ ๊ฒธ ์ ํ ๊ฐ๋ฐ์ ๊ณ์ ์ ๋ค์ด๊ฐ๋๋ฐ, ์๊ฐ๋ณด๋ค ๋ง์ ์ฌ๋๋ค์ด ์ฑ์ ์ฌ์ฉํ๊ณ ์์๋ค.
์ ๋ง ๊ธฐ๋ณธ ์ค์ ๊ธฐ๋ณธ์ด์๋ ์ฑ์ธ๋ฐ, ์ด๋ ๊ฒ๋ ๋ง์ ์ฌ์ฉ์๊ฐ ์๋ค๋,,
(๊ทผ๋ฐ ์๋ฌด๋ ๋ฆฌ๋ทฐ๋ฅผ ๋ฌ์ง ์์ ์๋ฌด๋ฐ ํผ๋๋ฐฑ์ ๋ฐ์ง ๋ชปํ๊ณ ์๋ค๋,,,)
์์ง ๋ถ์ ๋ถ๋ถ์ ๋ณด๋ ๋ฐฉ๋ฒ๋ ๋ชจ๋ฅด์ง๋ง.. (ํ๊ท ์ ์ง์จ์ด ๋ฐ์ดํฐ ๋ถ์กฑ์ด๋ฉด ์๋ฌด๋ ์ ์ง ์ํ๋๊ฑด๊ฐ ํน์)
๊ทธ๋๋ ๋๊ตฐ๊ฐ ์ฌ์ฉํ๊ณ ์์ผ๋
์์ง ๊ฐ๋ฐ์๊ฐ ์ด ์ฑ์ ๊พธ์คํ ์๊ฐ์ ์๊ณ ์๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๊ณ ์,, ์ ๋ฐ์ดํธ๋ฅผ ๊ฒฐ์ฌํ๊ฒ ๋์๋ค.
์์ ๊ทธ๋ผ ์ด์ UserDefaults์ ๋ํด ์์๋ณด์ !!
UserDefaults ์ธ์ ์ฌ์ฉํ๋?
๋๋, ํ ํฑ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋๋ฐ, ํด๋น ๊ธฐ๋ฅ์ On, Off๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
UserDefaults์ ๋ํ ๊ณต์ ๋ฌธ์๋ฅผ ๋ด๋ณด์
An interface to the user’s defaults database, where you store key-value pairs persistently across launches of your app.
-> ์ฑ์ด ์คํ๋ ๋๋ง๋ค ์ฌ์ฉ์์ ๊ธฐ๋ณธ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํค-๊ฐ ์์ ์ง์์ ์ผ๋ก ์ ์ฅํ๋ ์ธํฐํ์ด์ค๋ผ๋ ๋ง์ด๋ค.
๋ ์ฝ๊ฒ ๋งํ๋ฉด, ๋ฐํ์์์, UserDefaults ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ์์ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉ์์ ๊ธฐ๋ณธ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฝ์ ์ ์๋ค. UserDefaults๋ ์ด ์ ๋ณด๋ฅผ ์บ์ํ์ฌ ๋งค๋ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด์ง ์๊ณ ๋ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค.
์ด ์ธ์ ๊ณต์ ๋ฌธ์ ๋ด์ฉ์ ์ ๋ฆฌํ๋ฉด,
1. UserDefaults ํด๋์ค๋ ์ฌ์ฉ์์ ๊ธฐ๋ณธ๊ฐ ์์คํ ์ ๋ค๋ฃฐ ์ ์๋ ํ๋ก๊ทธ๋๋ฐ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
2. ์ด ๊ธฐ๋ณธ๊ฐ ์์คํ ์ ์ฌ์ฉํ๋ฉด ์ฑ์ด ์คํ๋ ๋ ์ฌ์ฉ์ ๊ฐ์ธ์ ์ ํธ๋์ ๋ง๊ฒ ์ฑ์ ๋์์ ๋ง์ถ ์ ์๋ค.
- ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ์ ํธํ๋ ๋จ์๋ ๋ฏธ๋์ด ์ฌ์ ์๋๋ฅผ ์ค์ ํ ์ ์๋ค.
3. ์ฑ์ ์ด๋ฌํ ์ ํธ๋๋ฅผ ์ฌ์ฉ์์ ๊ธฐ๋ณธ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ์ฌ, ์ฑ์ด ์์๋ ๋ ๊ธฐ๋ณธ ์ํ๋ฅผ ์ค์ ํ๊ฑฐ๋ ์ฑ์ ๊ธฐ๋ณธ ๋์์ ๊ฒฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
๊ฒฐ๊ตญ! ์ฝ๊ฒ ๋งํด UserDefaults๋ ์ฌ์ฉ์๊ฐ ์ค์ ํ ์ธ์ด, ํ ๋ง, ๋ง์ง๋ง ๋ก๊ทธ์ธ ์ ๋ณด ๋ฑ์ ์ ์ฅํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
UserDefaults๋ ์ด๋์ ์๋๊ฑฐ์ฃ ?
๋ฌธ๋ UserDefaults๋ ์ด๋์ ์๊ธธ๋ ์ฑ์ ์์ ์ข ๋ฃํ๊ณ , ๋ค์ ๋ค์ด์๋ ๊ทธ ๊ฐ์ด ์ ์ฅ ๋๋์ง ๊ถ๊ธํ๋ค.
UserDefaults๋ ์ฑ ๋ด์์๋ง ์ฌ์ฉ๋๋ฉฐ, ์์คํ ์ "๊ธฐ๋ณธ๊ฐ" ์ ์ฅ์์ ํด๋นํ๋ค๊ณ ํ๋ค.
์ค์ ๋ก๋ ํด๋น ๊ฐ๋ค์ด ํ์ผ ์์คํ ์ ์ ์ฅ๋๋๋ฐ, ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ์ฑ ์๋๋ฐ์ค ๋ด์ ํ์ผ ์์คํ ์ ์์นํ๋ค.
๊ทธ๋์ ์ฌ์ฉ์๊ฐ ์ฑ์ ์ฌ์ค์นํ๊ฑฐ๋, ์ฑ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋์ง ์๋ ํ ๊ฐ์ด ์ ์ง๋๋ค.
์ด๋ป๊ฒ ์ฌ์ฉํ๋์?
๊ทธ๋ผ ์ด์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์ ๋ฆฌํด๋ณด์.
UserDefaults๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ค์ํ๋ฐ, ๋๋ JSONEncoder/Decoder ๋ฐฉ์์ ์ ํํ๋ค.
๋จผ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐ์ฒด ํํ๋ก ์ ์ฅํด์ฃผ์๋ค.
Codable ํ์ ์ผ๋ก ์ ์ฅํ์ฌ ์ธ์ฝ๋ฉ๊ณผ ๋์ฝ๋ฉ ํ ๋ ๋ฐ์ดํฐ ๋ณํ์ด ์ฝ๊ฒ ์ด๋ฃจ์ด์ง๋๋ก ํ๋ค.
struct UserInfo: Codable {
var isAnimation : Bool
var isHaptic : Bool
}
๋ค์์ผ๋ก userInfoManager ํด๋์ค๋ฅผ ์์ฑํ์๋ค.
์ด ํด๋์ค๋ UserInfo ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ์ญํ ์ ํ ๊ฒ์ด๋ค.
์ฆ, UserInfo์ ์๋ ์ ๋๋ฉ์ด์ ๊ณผ ํ ํฑ ์ค์ ์ UserDefaults๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ์ ๋ค์ ์คํํด๋ ์ด ์ค์ ๊ฐ๋ค์ด ์ ์ง๋๋๋ก ๊ด๋ฆฌํ๊ธฐ ์ํจ์ด๋ค.
class userInfoManager {
static let shared = userInfoManager() // 1๏ธโฃ ์ฑ๊ธํคํจํด
private let key = "userInfo"
var userInfo: UserInfo {
get {
if let data = UserDefaults.standard.data(forKey: key), // 2๏ธโฃ UserDefaults์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ด
let decoded = try? JSONDecoder().decode(UserInfo.self, from: data) { // 3๏ธโฃ JSONDecoder๋ฅผ ์ฌ์ฉํด ๋์ฝ๋ฉ
return decoded // 4๏ธโฃ ๋์ฝ๋ฉ ์ฑ๊ณตํ๋ฉด ๊ฐ์ ๋ฐํ
}
return UserInfo(isAnimation: true, isHaptic: true) // 5๏ธโฃ ์ ์ฅ๋ ๊ฐ์ด ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ ๋ฐํ
}
set {
if let encoded = try? JSONEncoder().encode(newValue) { // 6๏ธโฃ JSONEncoder๋ฅผ ์ฌ์ฉํด ์ธ์ฝ๋ฉ
UserDefaults.standard.set(encoded, forKey: key) // 7๏ธโฃ UserDefaults์ ์ ์ฅ
}
}
}
}
1. ์ฑ๊ธํค ํจํด
static let shared = userInfoManager()
์ฑ๊ธํค ํจํด์ ์ฌ์ฉํด ์ฑ ์ ์ฒด์์ ๋จ ํ๋์ ์ธ์คํด์ค๋ง ์กด์ฌํ๊ฒ ๋๋ค. ์ด๋ ๊ฒ ์ฑ๊ธํค ํจํด์ ์ฌ์ฉํจ์ผ๋ก์จ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ๊ณ ์์ ํ ๋ ์ ์ฉํ๊ฒ ํ ์ ์๋ค.
2. UserDefaults์์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
UserDefaults.standard.data(forKey: key) ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
์ฝ๋๋ฅผ ์ฝ๊ฒ ์ค๋ช ํด๋ณด๋ฉด,
- UserDefaults๋?
- UserDefaults๋ ๊ฐ๋จํ ๋ฐ์ดํฐ ์ ์ฅ์๋ก, ์ฑ์ ์ข ๋ฃํ๊ณ ๋ค์ ์คํํด๋ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ ์ ์๋ค.
- forKey: key๋?
- forKey: key๋ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ๋ ์ฌ์ฉํ๋ ์๋ณ์์ด๋ค.
- ๋ฐ์ดํฐ๋ key๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ฅ๋๊ณ , ์ด ์ด๋ฆ์ ํตํด ๋์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๋ค.
- data(forKey:)๋?
- data(forKey:)๋ UserDefaults์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํธ ๋ฐฐ์ด ํ์์ผ๋ก ๊ฐ์ ธ์จ๋ค.
- ์ด ๋ฐ์ดํฐ๋ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ํ์ ์ผ๋ก ๋ณํํด์ผ ์ฌ์ฉํ ์ ์๋ค.
- ์๋ฅผ ๋ค์ด, UserDefaults์ ์ ์ฅ๋ ๋ฐ์ดํฐ๊ฐ UserInfo ๊ตฌ์กฐ์ฒด๋ผ๋ฉด, ์ด๋ฅผ JSONDecoder๋ก ๋์ฝ๋ฉํ์ฌ UserInfo ๊ฐ์ฒด๋ก ๋ณํํด์ผ ํ๋ค.
3~6. UserDefaults ์ ์๋ ์ ๋ณด ์ธ์ฝ๋ฉ, ๋์ฝ๋ฉ ํ๊ธฐ
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋์ฝ๋ฉ๊ณผ ์ธ์ฝ๋ฉ ๊ณผ์ ์ด ์๋ค.
ํฌ๊ฒ get๊ณผ set์ผ๋ก ๋๋๋๋ฐ, UserDefaults๋ Bool, Int, Double, String, Data, Array, Dictionary ๊ฐ์ ๊ธฐ๋ณธ ํ์ ๋ง ์ ์ฅํ ์ ์๋ค.
ํ์ง๋ง ์์์ ์ ์ํ UserInfo๋ ๊ตฌ์กฐ์ฒด์ด๋ฏ๋ก ๊ทธ๋๋ก ์ ์ฅํ ์ ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ JSONEncoder๋ก ๋ณํ(์ธ์ฝ๋ฉ)ํ๊ณ , ๋ค์ ๋ถ๋ฌ์ฌ ๋ JSONDecoder๋ก ๋ณํ(๋์ฝ๋ฉ)ํ๋ ๊ฒ์ด๋ค.
7. UserDefaults์ ์ ๋ณด ์ ์ฅํ๊ธฐ
UserDefaults.standard.set(encoded, forKey: key)
์ ๋ณด๋ฅผ ์ ์ฅํ ๋๋ setํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
์ด ๋, nil ๊ฐ์ ์ ์ฅํ๊ฒ ๋๋ค๋ฉด, ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ง์ฐ๋ ๊ฒ๊ณผ ๊ฐ๋ค๊ณ ํ๋ค.
์ฆ, ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ค๋ฉด, nil์ ๋ฃ์ด์ฃผ๋ฉด๋๋ค !
์ ์ฒด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ ์ฒด ์ฝ๋
struct UserInfo: Codable {
var isAnimation : Bool
var isHaptic : Bool
}
class userInfoManager {
static let shared = userInfoManager() // 1๏ธโฃ ์ฑ๊ธํคํจํด
private let key = "userInfo"
var userInfo: UserInfo {
get {
if let data = UserDefaults.standard.data(forKey: key), // 2๏ธโฃ UserDefaults์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ด
let decoded = try? JSONDecoder().decode(UserInfo.self, from: data) { // 3๏ธโฃ JSONDecoder๋ฅผ ์ฌ์ฉํด ๋์ฝ๋ฉ
return decoded // 4๏ธโฃ ๋์ฝ๋ฉ ์ฑ๊ณตํ๋ฉด ๊ฐ์ ๋ฐํ
}
return UserInfo(isAnimation: true, isHaptic: true) // 5๏ธโฃ ์ ์ฅ๋ ๊ฐ์ด ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ ๋ฐํ
}
set {
if let encoded = try? JSONEncoder().encode(newValue) { // 6๏ธโฃ JSONEncoder๋ฅผ ์ฌ์ฉํด ์ธ์ฝ๋ฉ
UserDefaults.standard.set(encoded, forKey: key) // 7๏ธโฃ UserDefaults์ ์ ์ฅ
}
}
}
}
์ด๋ ๊ฒ UserDefaults๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ์ค์ ํ ๋ด์ฉ์ ์ ์ฅํด๋ณด์๋ค.
UserDefaults๋ฅผ ์ฌ์ฉํ๋ ์ฑ๊ธํค ํจํด์ ์จ์ ์๋ฌด๊ณณ์์๋ ํ์ํ ๋ ๋ถ๋ฌ์ค๊ณ , ์ ๋ฐ์ดํธ ํ ์ ์์ด ํธ๋ฆฌํ๋ค.
๋ค๋ฅธ ๋ทฐ์์ ์ฌ์ฉํ๊ธฐ
let savedUser = UserInfoManager.shared.userInfo
if savedUser.isHaptic == true {
HapticManager.shared.hapticImpact(style: UIImpactFeedbackGenerator.FeedbackStyle.light)
}
์ด๋ฐ์์ผ๋ก savedUser ๋ณ์์ ์ ์ฅ๋ผ ์๋ ์ ๋ณด๋ฅผ ๋ค์ ์ ์ฅํ๊ณ , ํด๋น ๋ด์ฉ์ด true๋ก ์ค์ ๋์ด ์์ผ๋ฉด ๊ทธ์ ๋ง๋ ํ ํฑ์ ์ฃผ์๋ค.
toggleSwitch.isOn = savedUserInfo.isAnimation
๊ทธ๋ฆฌ๊ณ , ๋ง์ฝ ์ฌ์ฉ์๊ฐ ์ค์ ์ ๋ฐ๊พธ๋ฉด ๋ฐ๋ ๋ด์ฉ์ ๋ค์ UserDefaults์ ์ ๋ฐ์ดํธ ํด์ฃผ์๋ค.
์ง๊ธ๊น์ง ์ ์์ง๋ ๋ชปํ๋ฉด์ UserDefaults์ ๋ ๋ค ์ ์ฅํด์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๋ถ๋ฌ์ค๊ณค ํ์๋๋ฐ ์ด์ ์ผ ์ ๋๋ก ์๊ฒ๋๋ค.
์๊ฐ์ ๊ฝค ๊ฑธ๋ ธ์ง๋ง, ๊ทธ๋๋ ์๊ณ ๋๋ ๋ ์ ์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ๋ค !
'๐ iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] UIButton ๋ฒํผ ๋ด ์ด๋ฏธ์ง ํฌ๊ธฐ ์กฐ์ ํ๊ธฐ (1) | 2024.12.31 |
---|---|
[iOS] tableView ์ ์๋ ๊ตฌ๋ถ์ ์์ ๊ธฐ (0) | 2024.11.19 |
[iOS] apple login ๊ตฌํํ๊ธฐ (2) | 2024.09.14 |
[iOS] DeviceActivity ์ ๋ฆฌ ๋ฐ ์คํฌ๋ฆฐํ์ ์ ๊ทผ ๊ถํ, ์ฑ ์ ํํ๊ธฐ (4) | 2024.09.12 |
[iOS] ScreenTime API ๋? (8) | 2024.09.11 |