sladuf
200
sladuf
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (83)
    • ๐Ÿ“š Programming (32)
      • Swift (13)
      • JAVA (2)
      • Python (6)
      • SQL (6)
      • Web (5)
    • ๐Ÿ“ฑ iOS (25)
      • Base (7)
      • SwiftUI (9)
      • UIKit (7)
      • ์ธ๊ฐ• & ์ฑ… (2)
    • ๐Ÿ”— Algorithm (20)
      • Python (12)
      • Swift (3)
      • Tip (5)
    • ๐Ÿ—‚ ETC (6)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • Swift
  • ์Šค์œ„ํ”„ํŠธ

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

๊ธ€์“ฐ๊ธฐ ์„ค์ •
hELLO ยท Designed By ์ •์ƒ์šฐ.
sladuf

200

UserDefaults ๊ฐ’ ํ•˜๋‚˜๋กœ ์•ฑ ์ง„์ž…์‹œ 1ํšŒ๋งŒ ๊ฒ€์‚ฌํ•˜๋Š” ๋กœ์ง ๊ด€๋ฆฌํ•˜๊ธฐ
๐Ÿ“ฑ iOS/Base

UserDefaults ๊ฐ’ ํ•˜๋‚˜๋กœ ์•ฑ ์ง„์ž…์‹œ 1ํšŒ๋งŒ ๊ฒ€์‚ฌํ•˜๋Š” ๋กœ์ง ๊ด€๋ฆฌํ•˜๊ธฐ

2024. 6. 20. 18:06

 

 

 

 

 

์•ฑ์„ ์„œ๋น„์Šคํ•˜๋‹ค๋ณด๋ฉด ๋ฒ„๊ทธ๊ฐœ์„  ๋˜๋Š” ์—…๋ฐ์ดํŠธ ์•ˆ๋‚ด ๋“ฑ์˜ ์ด์œ ๋กœ ๋‹จ 1ํšŒ๋งŒ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, TiTi์—์„œ๋Š” ๋น„์–ด์žˆ๋Š” ๊ธฐ๋ก ๊ฐ์ฒด์ธ Daily๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š์•„์„œ Logํ™”๋ฉด์— ๊ธฐ๋ก์ด ์žˆ๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ์š”,

๋ณด๋‹ค์‹œํ”ผ ๊ธฐ๋ก์ด ๋น„์–ด ์žˆ๋Š”๋ฐ๋„ ๋‚ ์งœ ์•„๋ž˜์— ์ ์ด ์ฐํ˜€ ์žˆ์Šต๋‹ˆ๋‹ค (๊ธฐ๋ก์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ ์ด ์ฐํ˜€ ์žˆ์–ด์•ผํ•จ)

 

 

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‘ ๊ฐ€์ง€ ๋™์ž‘์ด ํ•„์š” ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 

1. ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๋ก์„ ํŽธ์ง‘ํ•ด์„œ ๊ทธ ๋‚ ์˜ ๊ธฐ๋ก์„ ๋ชจ๋‘ ์ง€์šฐ๋Š” ๊ฒฝ์šฐ Daily๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

2. ๋ฒ„๊ทธ ๊ฐœ์„  ์ „์— ์กด์žฌํ–ˆ๋˜ ๋น„์–ด์žˆ๋Š” Daily๊ฐ์ฒด๋ฅผ ๋ชจ๋‘ ์‚ญ์ œํ•œ๋‹ค.

 

์—ฌ๊ธฐ์„œ 2๋ฒˆ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ์ง„์ž…ํ•  ๋•Œ 1ํšŒ๋งŒ ์ž‘์—…ํ•˜๋ฉด ๋˜๋Š” ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ฒˆ ๋™์ž‘ํ•ด๋„ ๋ฌธ์ œ๋Š” ์—†๊ฒ ์ง€๋งŒ, ๋น„์–ด ์žˆ๋Š” Daily๊ฐ์ฒด๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ์กด์žฌํ•˜๋Š” Daily ๊ฐ์ฒด๋ฅผ ์™„์ „ํƒ์ƒ‰ ํ•ด์•ผํ•˜๊ณ  1ํšŒ ์ž‘์—… ์ดํ›„์—๋Š” ๋น„์–ด ์žˆ๋Š” Daily๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š” ์—†๋Š” ๋™์ž‘์„ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์ฃ !

 

 

์•„๋ฌดํŠผ, ์ด๋Ÿฐ ์ด์œ ๋กœ 1ํšŒ๋งŒ ์ž‘์—…ํ•˜๊ฒŒ ๋  ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

1. ์ž‘์—…์˜ ํšŸ์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ธฐ

๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

private func removeEmptyDailys() {
    RecordsManager.shared.dailyManager.removeEmptyDailys()
}


// RecordsManager.shared.dailyManager.removeEmptyDailys()
func removeEmptyDailys() {
    dailys = dailys.filter { daily in
        return daily.totalTime > 0
    }
    self.saveDailys()
}

 

์ด ํ•จ์ˆ˜๋ฅผ ์•ฑ์„ ์ผค๋•Œ ๋งˆ๋‹ค ๋™์ž‘ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด์ฃ .

์•ž์„œ ๋งํ•œ๋Œ€๋กœ ์ด๋Š” dailys๋ฅผ ์™„์ „ ํƒ์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ๐Ÿ‘Ž๐Ÿป

 

 

 

2. UserDefaults๋กœ๊ด€๋ฆฌํ•˜๊ธฐ

private func removeEmptyDailys() {
    guard let _ =  UserDefaults.standard.object(forKey: "didRemoveEmptyDailys") as? Bool else {
        RecordsManager.shared.dailyManager.removeEmptyDailys()
        UserDefaults.standard.setValue(true, forKey: "didRemoveEmptyDailys")
        return
    }
}

 

์ด ๋ฐฉ๋ฒ•์€ ์‹ค์ œ๋กœ 1ํšŒ๋งŒ ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, UserDefaults์— ๋„ฃ์€ Bool๊ฐ’์ด ์‹ค์ œ๋กœ๋Š” ์•„๋ฌด ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค.

1ํšŒ ๋™์ž‘ ์ „์—๋Š” UserDefaults์— ๊ฐ’์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— guard๋ฌธ ๋‚ด๋ถ€๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ดํ›„์—๋Š” UserDefaults์— ๊ฐ’์ด ์žˆ๊ณ , ๊ทธ ๋ง์€ 1ํšŒ ๋™์ž‘์„ ํ–ˆ๋‹ค๋Š” ์˜๋ฏธ์ด๊ธฐ ๋•Œ๋ฌธ์— true/false ์–ด๋–ค ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋„ ๋ฌด๊ด€ํ•ฉ๋‹ˆ๋‹ค.

 

์ฆ‰, UserDefaults์—  ๊ฐ’์ด ์กด์žฌ ํ•˜๋Š”์ง€์˜ ์—ฌ๋ถ€๋กœ ๋™์ž‘ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

UserDefaults๋กœ ๊ฐ’์„ ์ €์žฅํ•˜๋Š”๊ฒƒ ์กฐ์ฐจ 1ํšŒ์„ฑ์ธ ๊ฒƒ์ด์ฃ .

 

UserDefaults๋Š” ๋น„ํœ˜๋ฐœ์„ฑ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ž‘์€ ๊ฐ’์ด์ง€๋งŒ, ์ด๋Ÿฌํ•œ 1ํšŒ์„ฑ ๋™์ž‘์ด ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๋œ๋‹ค๋ฉด ๋ถ„๋ช… ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‚ญ๋น„ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋‚˜์˜ UserDefaults ๊ฐ’์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ 1ํšŒ์„ฑ ๋™์ž‘๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 

3. 1ํšŒ์„ฑ ๋™์ž‘์„ Version์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ

 

์œ ์ €๊ฐ€ ์—…๋ฐ์ดํŠธ ํ–ˆ๋˜ ๋ฒ„์ „์„ ๊ธฐ๋กํ•˜์—ฌ,

1ํšŒ์„ฑ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ๋ฒ„์ „์„ ํ†ตํ•ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ข€ ๋” ์‰ฝ๊ฒŒ.. ์„ค๋ช…ํ•ด๋ณด์ž๋ฉด

 

์˜ˆ๋ฅผ ๋“ค์–ด, `removeEmptyDailys`๊ฐ€ 2.1 ๋ฒ„์ „์— ์—…๋ฐ์ดํŠธ ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

- ์‚ฌ์šฉ์ž๊ฐ€ 2.0 ๋ฒ„์ „์„ ์“ฐ๋‹ค๊ฐ€ 2.1 ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ  ์•ฑ์„ ์ผ ๋‹ค๋ฉด? -> removeEmptyDailys ์ˆ˜ํ–‰โญ•๏ธ
- ์‚ฌ์šฉ์ž๊ฐ€ 2.1 ๋ฒ„์ „์„ ์“ฐ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ์ผ ๋‹ค๋ฉด? -> removeEmptyDailys ์ˆ˜ํ–‰โŒ
- ์‚ฌ์šฉ์ž๊ฐ€ 2.1 ๋ฒ„์ „์„ ์“ฐ๋‹ค๊ฐ€ 3.0 ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ  ์•ฑ์„ ์ผ ๋‹ค๋ฉด? -> removeEmptyDailys ์ˆ˜ํ–‰โŒ

 

์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค !

 

์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์“ฐ๋˜ ๋ฒ„์ „์€ UserDefaults์— ์ €์žฅํ•ด์„œ ๊ด€๋ฆฌํ•˜๊ณ ,

์ˆ˜ํ–‰ํ•  ๋กœ์ง์€ ์–ด๋–ค ๋ฒ„์ „์—์„œ ์ˆ˜ํ–‰๋ ์ง€๋ฅผ enum์œผ๋กœ ์ €์žฅํ•ด์„œ ๊ด€๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๋ง์€ ๋„ˆ๋ฌด ์–ด๋ ค์šฐ๋‹ˆ..

๋™์ž‘์„ ๊ด€๋ฆฌํ•  Version๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

struct Version {
}

 

 

๋จผ์ €, ํ˜„์žฌ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋””๊นŒ์ง€ ์—…๋ฐ์ดํŠธ ๋˜์—ˆ๋Š”์ง€ ๊ธฐ๋ก์„ ํ•ด์•ผ๊ฒ ์ฃ ? == ์‚ฌ์šฉ์ž๊ฐ€ ์“ฐ๋˜ ๋ฒ„์ „

๊ทธ ๋ฒ„์ „์„ UserDefaults์— ๊ธฐ๋ก ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ, lastUpdateVersion์ด๋ผ๊ณ  ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

static private var lastUpdateVersion: String {
    UserDefaults.standard.object(forKey: "lastUpdateVersion") as? String ?? "2.0"
}

 

lastUpdateVersion์€ ์œ ์ €๊ฐ€ ์•ฑ์„ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ ์ง์ „์— ์‚ฌ์šฉํ•˜๋˜ ์•ฑ์˜ ๋ฒ„์ „์„ ๋‹ด๊ณ  ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

default value๋ฅผ 2.1๋กœ ํ•ด์ค€ ์ด์œ ๋Š” ์ฒ˜์Œ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋™์ž‘ ์‹œํ‚ฌ ๋•Œ UserDefaults์— ๊ฐ’์ด ์—†๊ธฐ ๋•Œ๋ฌธ์—,

Keys์— ์žˆ๋Š” ๋กœ์ง์ด ๋ชจ๋‘ ์‹คํ–‰๋˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด Keys์ค‘์— ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ ๋ณด๋‹ค ์ž‘์€ ๋ฒ„์ „์„ default value๋กœ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

 

 

1ํšŒ์„ฑ ๋กœ์ง๋“ค์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด key๊ฐ’์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

private enum Keys: String, CaseIterable {
    case removeEmptyDailys = "2.1"
    case anotherOnceLogic = "2.7"
}

 

์—ฌ๊ธฐ์„œ ๊ฐ€์ง€๋Š” rawValue๋Š” ์œ ์ €๊ฐ€ ์ด ๋ฒ„์ „๋ณด๋‹ค ๋‚ฎ์€ ๋ฒ„์ „์„ ์ผ๋‹ค๊ฐ€ ์•ฑ์„ ์—…๋ฐ์ดํŠธ ํ–ˆ๋‹ค๋ฉด ํ•ด๋‹น ๋กœ์ง์„ ์ˆ˜ํ–‰ํ• ๊ฑฐ์•ผ!

๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด,

์œ ์ €๊ฐ€ 2.1๋ณด๋‹ค ๋‚ฎ์€ ๋ฒ„์ „์„ ์“ฐ๋‹ค๊ฐ€ ์•ฑ์„ ์—…๋ฐ์ดํŠธ ํ–ˆ๋‹ค๋ฉด removeEmptyDailys๋ฅผ ์ˆ˜ํ–‰ํ• ๊ฑฐ์•ผ!

๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

 

 

์ด์ œ,

- ์‚ฌ์šฉ์ž๊ฐ€ 2.0 ๋ฒ„์ „์„ ์“ฐ๋‹ค๊ฐ€ 2.1 ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ  ์•ฑ์„ ์ผ ๋‹ค๋ฉด? -> removeEmptyDailys ์ˆ˜ํ–‰โญ•๏ธ
- ์‚ฌ์šฉ์ž๊ฐ€ 2.1 ๋ฒ„์ „์„ ์“ฐ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ์ผ ๋‹ค๋ฉด? -> removeEmptyDailys ์ˆ˜ํ–‰โŒ
- ์‚ฌ์šฉ์ž๊ฐ€ 2.1 ๋ฒ„์ „์„ ์“ฐ๋‹ค๊ฐ€ 3.0 ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ  ์•ฑ์„ ์ผ ๋‹ค๋ฉด? -> removeEmptyDailys ์ˆ˜ํ–‰โŒ

 

 

์š” ๋กœ์ง๋“ค์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

/// (extension String) static let currentVersion: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String

static func update() {
    if lastUpdateVersion == String.currentVersion { return }

    for key in Keys.allCases {
        if !check(forKey: key) { continue }
        switch key {
        case .removeEmptyDailys:
            removeEmptyDailys()
        case .anotherOnceLogic:
        	anotherOnceLogic()
        }
    }

    UserDefaults.standard.setValue(String.currentVersion, forKey: "lastUpdateVersion")
}

static private func check(forKey key: Versions.Keys) -> Bool {
    let checkVer = key.rawValue
    return checkVer.compare(lastUpdateVersion, options: .numeric) == .orderedDescending
}

 

 

์ฝ”๋“œ๋ฅผ ์ฐฌ์ฐฌํžˆ ์‚ดํŽด ๋ณผ๊ฒŒ์š”.

if lastUpdateVersion == String.currentVersion { return }

 

 

์œ ์ €๊ฐ€ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ ์ง์ „ ๋ฒ„์ „(lastUpdateVersion)๊ณผ ์—…๋ฐ์ดํŠธ ํ•œ ๋ฒ„์ „(currentVersion)์ด ๋™์ผํ•˜๋ฉด, ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

(์ด๋ฏธ ์—…๋ฐ์ดํŠธ๊ฐ€ ์™„๋ฃŒ ๋˜์—ˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค)

 

 

for key in Keys.allCases {
    if !check(forKey: key) { continue }
    switch key {
    case .removeEmptyDailys:
        removeEmptyDailys()
    case .anotherOnceLogic:
        anotherOnceLogic()
    }
}

 

check()๋ฅผ ํ†ตํ•ด key์˜ ๋ฒ„์ „๊ณผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์ง์ „ ๋ฒ„์ „์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

key์˜ ๋ฒ„์ „์ด ๋” ๋†’์€ ๊ฒฝ์šฐ์—๋งŒ true์ž…๋‹ˆ๋‹ค.

 

check()๊ฐ€ true๋ผ๋ฉด ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

ํ•ด๋‹น key์— ๋งž๋Š” ๋กœ์ง์„ ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•ด๋‘๊ณ , ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

removeEmptyDailys๋กœ ์˜ˆ๋ฅผ ๋“ค๋ฉด,

์‚ฌ์šฉ์ž๊ฐ€ ์—…๋ฐ์ดํŠธ ์ „์— 2.0๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๋ฉด check๋Š” true์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด switch๋ฌธ์„ ํ†ตํ•ด removeEmptyDailys()๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

UserDefaults.standard.setValue(String.currentVersion, forKey: "lastUpdateVersion")

 

๋กœ์ง์ด ๋ชจ๋‘ ์ˆ˜ํ–‰๋˜๊ณ  ๋‚˜๋ฉด, lastUpdateVersion๊ฐ’์„ ํ˜„์žฌ ๋ฒ„์ „์œผ๋กœ ๋ฐ”๊ฟ” ์ค๋‹ˆ๋‹ค.

์ฆ‰, 2.0๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋˜ ์‚ฌ์šฉ์ž๊ฐ€ 2.1 ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ–ˆ๋‹ค๋ฉด lastUpdateVersion์€ 2.1๋กœ ๋ณ€๊ฒฝ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค์Œ์— ์•ฑ์„ ์ผฐ์„ ๋•Œ, update()์—์„œ

if lastUpdateVersion == String.currentVersion { return }

 

์š” ์กฐ๊ฑด๋ฌธ์— ๊ฑธ๋ ค ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ฒ ์ฃ ?

์ฆ‰, ์—…๋ฐ์ดํŠธ ๋กœ์ง์„ 1ํšŒ๋งŒ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

 

์กฐ๊ฐ๋œ ์ฝ”๋“œ๋ฅผ ๋ชจ์•„์„œ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

struct Versions {
    
    static private var lastUpdateVersion: String {
        UserDefaultsManager.get(forKey: .lastUpdateVersion) as? String ?? "2.0"
    }
    
    private enum Keys: String, CaseIterable {
        case removeEmptyDailys = "2.1"
        case anotherOnceLogic = "2.7"
    }
    
    static func update() {
        if lastUpdateVersion == String.currentVersion { return }

        for key in Keys.allCases {
            if !check(forKey: key) { continue }
            switch key {
            case .removeEmptyDailys:
                removeEmptyDailys()
            case .anotherOnceLogic:
                anotherOnceLogic()
            }
        }

        UserDefaults.standard.setValue(String.currentVersion, forKey: "lastUpdateVersion")
    }

    static private func check(forKey key: Versions.Keys) -> Bool {
        let checkVer = key.rawValue
        return checkVer.compare(lastUpdateVersion, options: .numeric) == .orderedDescending
    }
    
    static private func removeEmptyDailys() {
    	//code
    }
    
    static private func anotherOnceLogic() {
    	//code
    }
}

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, UserDefaults๊ฐ’ ํ•˜๋‚˜๋กœ 1ํšŒ๋งŒ ๋™์ž‘ํ•˜๋Š” ๋กœ์ง๋“ค์„ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

 

 

์™ธ๋ถ€์—์„œ๋Š” update() ํ•จ์ˆ˜ ํ˜ธ์ถœ๋งŒ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Versions.update()

 

 

 

 

 

๋” ์ข‹์€ ์˜๊ฒฌ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค ๐Ÿ˜Š

 

 

 

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐Ÿ“ฑ iOS > Base' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Swift] ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ NetworkManager๋งŒ๋“ค๊ธฐ (feat. Generic)  (3) 2023.05.05
[Swift] ์„œ๋ฒ„์— iOS ์ด๋ฏธ์ง€ ๋ณด๋‚ผ ๋•Œ ์šฉ๋Ÿ‰ ์ด์Šˆ & ํ•ด๊ฒฐ  (0) 2023.03.23
[Swift] json value type์ด ๋‹ฌ๋ผ์ง€๋Š” response์— ๋Œ€์‘ํ•˜์—ฌ API Responder๋งŒ๋“ค๊ธฐ  (0) 2023.02.12
[RxSwift] ๊ฐœ๋…์žก๊ธฐ (Subscribe, Observable, Subject)  (0) 2023.02.04
[Swift] Custom Calendar ๋‹ฌ์˜ ๋งˆ์ง€๋ง‰ ๋‚  ๊ตฌํ•˜๊ธฐ  (0) 2023.01.16
    '๐Ÿ“ฑ iOS/Base' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [Swift] ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ NetworkManager๋งŒ๋“ค๊ธฐ (feat. Generic)
    • [Swift] ์„œ๋ฒ„์— iOS ์ด๋ฏธ์ง€ ๋ณด๋‚ผ ๋•Œ ์šฉ๋Ÿ‰ ์ด์Šˆ & ํ•ด๊ฒฐ
    • [Swift] json value type์ด ๋‹ฌ๋ผ์ง€๋Š” response์— ๋Œ€์‘ํ•˜์—ฌ API Responder๋งŒ๋“ค๊ธฐ
    • [RxSwift] ๊ฐœ๋…์žก๊ธฐ (Subscribe, Observable, Subject)
    sladuf
    sladuf

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”