TIL97 ✨

YaR LabΒ·2023λ…„ 9μ›” 5일
0

TIL✨

λͺ©λ‘ 보기
83/135
post-thumbnail

πŸ—“οΈ23.09.05

persistent container

// 이 κ΅¬ν˜„μ„ 적절히 였λ₯˜ μ²˜λ¦¬ν•˜λŠ” μ½”λ“œλ‘œ λŒ€μ²΄ν•˜μ„Έμš”.
// fatalError()λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ ν¬λž˜μ‹œ 둜그λ₯Ό μƒμ„±ν•˜κ³  μ’…λ£Œν•˜λ„λ‘ λ§Œλ“­λ‹ˆλ‹€. 배포용 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” 이 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„μ•Ό ν•˜λ©°, 개발 쀑에 μœ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

/*
μ—¬κΈ°μ„œ 였λ₯˜κ°€ λ°œμƒν•˜λŠ” 일반적인 μ΄μœ λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  • μƒμœ„ 디렉토리가 μ‘΄μž¬ν•˜μ§€ μ•Šκ±°λ‚˜ 생성할 수 μ—†κ±°λ‚˜ μ“°κΈ°κ°€ κΈˆμ§€λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
  • 잠긴 μƒνƒœμ—μ„œ μž₯치의 κΆŒν•œ λ˜λŠ” 데이터 보호둜 인해 영ꡬ μ €μž₯μ†Œμ— μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • μž₯μΉ˜μ— μ—¬μœ  곡간이 μ—†μŠ΅λ‹ˆλ‹€.
  • μ €μž₯μ†Œλ₯Ό ν˜„μž¬ λͺ¨λΈ λ²„μ „μœΌλ‘œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
    μ‹€μ œ λ¬Έμ œκ°€ 무엇인지 ν™•μΈν•˜λ €λ©΄ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό ν™•μΈν•˜μ„Έμš”.
    */

init persistent container

class AppDelegate: UIResponder, UIApplicationDelegate {
    ...
    lazy var persistentContainer: NSPersistentContainer = {        
        let container = NSPersistentContainer(name: "DataModel")
        container.loadPersistentStores { description, error in
            if let error = error {
                fatalError("Unable to load persistent stores: \(error)")
            }
        }
        return container
    }()
    ...
}

이 μ½”λ“œλŠ” Core Dataλ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ 영ꡬ μ»¨ν…Œμ΄λ„ˆ(NSPersistentContainer)λ₯Ό μƒμ„±ν•˜λŠ” Swift μ½”λ“œμž…λ‹ˆλ‹€. 영ꡬ μ»¨ν…Œμ΄λ„ˆλŠ” 데이터 λͺ¨λΈμ„ μ •μ˜ν•˜κ³  데이터λ₯Ό μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” μ€‘μš”ν•œ ꡬ성 μš”μ†Œ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

μ—¬κΈ°μ„œ μ½”λ“œλ₯Ό μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€:

  1. lazy var persistentContainer: NSPersistentContainer : persistentContainer λŠ” 영ꡬ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ μ†μ„±μž…λ‹ˆλ‹€. lazy ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλ˜μ–΄ 처음 접근될 λ•Œ μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€.

  2. let container = NSPersistentContainer(name: "Diary") : NSPersistentContainer μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. "Diary"λŠ” 데이터 λͺ¨λΈμ˜ 이름을 λ‚˜νƒ€λ‚΄λ©°, ν•΄λ‹Ή 이름에 ν•΄λ‹Ήν•˜λŠ” 데이터 λͺ¨λΈ νŒŒμΌμ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

  3. container.loadPersistentStores(completionHandler: { (storeDescription, error) in : 영ꡬ μ €μž₯μ†Œλ₯Ό λ‘œλ“œν•˜κ³ , λ‘œλ“œ μž‘μ—…μ΄ μ™„λ£Œλ˜λ©΄ ν΄λ‘œμ € λ‚΄λΆ€μ˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œ μ €μž₯μ†Œ λ‘œλ“œ μž‘μ—…μ΄ μ‹€νŒ¨ν•˜λ©΄ 였λ₯˜κ°€ μ „λ‹¬λ©λ‹ˆλ‹€.

  4. if let error = error as NSError? : λ§Œμ•½ 였λ₯˜κ°€ λ°œμƒν–ˆλ‹€λ©΄, ν•΄λ‹Ή 였λ₯˜λ₯Ό NSError ν˜•νƒœλ‘œ λ‹€μš΄μΊμŠ€νŒ…ν•˜κ³  μ•„λž˜μ˜ 였λ₯˜ 처리 μ½”λ“œ 블둝을 μ‹€ν–‰ν•©λ‹ˆλ‹€.

  5. fatalError("Unresolved error \(error), \(error.userInfo)") : 였λ₯˜ 처리 μ½”λ“œ λΈ”λ‘μ—μ„œ μ‹¬κ°ν•œ 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ 앱을 κ°•μ œλ‘œ μ’…λ£Œμ‹œν‚΅λ‹ˆλ‹€. 였λ₯˜ λ©”μ‹œμ§€μ™€ ν•¨κ»˜ μ’…λ£Œλ˜λ©°, μ΄λ ‡κ²Œ μ’…λ£Œλ˜λ©΄ ν¬λž˜μ‹œ 둜그λ₯Ό μƒμ„±ν•˜κ³  앱이 μ’…λ£Œλ©λ‹ˆλ‹€. 이 μ½”λ“œλŠ” 개발 쀑 디버깅을 μœ„ν•΄ μ‚¬μš©λ˜μ§€λ§Œ μ‹€μ œ μ•± 배포 μ‹œμ—λŠ” μ‚¬μš©ν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€.

이 μ½”λ“œλŠ” Core Dataλ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ 기본적인 섀정을 μˆ˜ν–‰ν•˜λ©°, μ €μž₯μ†Œ λ‘œλ“œ μž‘μ—…μ΄ μ‹€νŒ¨ν•  경우 앱을 μ’…λ£Œμ‹œν‚€λŠ” μ˜ˆμ™Έ μ²˜λ¦¬κ°€ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

0개의 λŒ“κΈ€