Setting up a Core Data stack 🍎

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

iOS 🍎

λͺ©λ‘ 보기
21/26
post-thumbnail

μ•±μ˜ 객체λ₯Ό κ΄€λ¦¬ν•˜κ³  μ˜μ†ν™”ν•˜λŠ” 클래슀λ₯Ό μ„€μ •

1️⃣ κ°œμš”

  • 데이터 λͺ¨λΈ νŒŒμΌμ„ λ§Œλ“  ν›„, μ•±μ˜ λͺ¨λΈ λ ˆμ΄μ–΄λ₯Ό ν˜‘λ ₯ν•˜μ—¬ μ§€μ›ν•˜λŠ” 클래슀λ₯Ό 섀정해야함
  • μ΄λŸ¬ν•œ ν΄λž˜μŠ€λ“€μ€ Core Data μŠ€νƒ(Core Data stack)
  • NSManagedObjectModel의 μΈμŠ€ν„΄μŠ€λŠ” μ•±μ˜ λͺ¨λΈ νŒŒμΌμ„ λ‚˜νƒ€λ‚΄λ©°, μ•±μ˜ μœ ν˜•, 속성 및 관계λ₯Ό μ„€λͺ…함
  • NSManagedObjectContext의 μΈμŠ€ν„΄μŠ€λŠ” μ•±μ˜ μœ ν˜•μ˜ μΈμŠ€ν„΄μŠ€μ— λŒ€ν•œ λ³€κ²½ 사항을 좔적함
  • NSPersistentStoreCoordinator의 μΈμŠ€ν„΄μŠ€λŠ” μ•±μ˜ μœ ν˜•μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ €μž₯μ†Œμ—μ„œ μ €μž₯ν•˜κ³  검색함
  • NSPersistentContainer의 μΈμŠ€ν„΄μŠ€λŠ” λͺ¨λΈ, μ»¨ν…μŠ€νŠΈ 및 μŠ€ν† μ–΄ 코디넀이터λ₯Ό ν•œ λ²ˆμ— 섀정함
  • μœ„μ˜ 클래슀 듀은 Core Data의 μ£Όμš” ν΄λž˜μŠ€λ“€λ‘œ, 데이터λ₯Ό κ΄€λ¦¬ν•˜κ³  μ˜μ†μ„±μ„ μ œκ³΅ν•˜λŠ” 데 μ‚¬μš©λ¨

πŸ“Œ Initialize a Persistent Container

Persistent Container의 μ΄ˆκΈ°ν™”

  • 일반적으둜 μ•±μ˜ μ‹œμž‘ μ‹œμ μ— Core Dataλ₯Ό μ΄ˆκΈ°ν™”ν•¨
  • μ•± λΈλ¦¬κ²Œμ΄νŠΈμ—μ„œ 처음 μ‚¬μš©ν•  λ•ŒκΉŒμ§€ μΈμŠ€ν„΄μŠ€ν™”λ₯Ό μ§€μ—°μ‹œν‚€κΈ° μœ„ν•΄ lazy λ³€μˆ˜λ‘œ 영ꡬ μ»¨ν…Œμ΄λ„ˆλ₯Ό 생성함
  • λ§Œμ•½ μƒˆλ‘œμš΄ Xcode ν”„λ‘œμ νŠΈλ₯Ό λ§Œλ“€ λ•Œ Core Data μ²΄ν¬λ°•μŠ€λ₯Ό μ„ νƒν–ˆλ‹€λ©΄, ν•΄λ‹Ή ν…œν”Œλ¦Ώμ€ AppDelegate에 이 초기 μ„€μ • μ½”λ“œλ₯Ό μžλ™μœΌλ‘œ ν¬ν•¨μ‹œν‚΄
  1. NSPersistentContainer νƒ€μž…μ˜ 지연 λ³€μˆ˜λ₯Ό μ„ μ–Έ
  2. 데이터 λͺ¨λΈ 파일 이름을 μΈμŠ€ν„΄μŠ€ν™”ν•˜λŠ” λ™μ•ˆ 인자둜 μ „λ‹¬ν•˜μ—¬ μ˜μ† μ»¨ν…Œμ΄λ„ˆ μΈμŠ€ν„΄μŠ€λ₯Ό 생성
  3. persistent storesλ₯Ό λ‘œλ“œ ν•˜λ©΄, μ €μž₯μ†Œκ°€ μ—†λŠ” κ²½μš°μ— μ €μž₯μ†Œλ₯Ό 생성함
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
    }()
    ...
}
  • ν•œ 번 μƒμ„±λ˜λ©΄ Persistent Container λŠ” ν•΄λ‹Ή managedObjectModel, viewContext, 그리고 persistentStoreCoordinator 속성을 톡해 λͺ¨λΈ, μ»¨ν…μŠ€νŠΈ, 그리고 μ €μž₯μ†Œ 코디넀이터 μΈμŠ€ν„΄μŠ€μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό μœ μ§€ν•¨
  • 이 ν›„, 이 μ»¨ν…Œμ΄λ„ˆμ— λŒ€ν•œ μ°Έμ‘°λ₯Ό μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€λ‘œ 전달할 수 있음

πŸ“Œ Pass a Persistent Container Reference to a View Controller

영ꡬ μ»¨ν…Œμ΄λ„ˆ μ°Έμ‘°λ₯Ό λ·° μ»¨νŠΈλ‘€λŸ¬μ— 전달

  • μ•±μ˜ 루트 λ·° μ»¨νŠΈλ‘€λŸ¬μ—μ„œ Core Dataλ₯Ό κ°€μ Έμ˜€κ³  영ꡬ μ»¨ν…Œμ΄λ„ˆμ— λŒ€ν•œ μ°Έμ‘°λ₯Ό λ³΄μœ ν•  λ³€μˆ˜λ₯Ό λ§Œλ“€μ–΄μ•Ό 함
import UIKit
import CoreData


class ViewController: UIViewController {


    var container: NSPersistentContainer!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        guard container != nil else {
            fatalError("This view needs a persistent container.")
        }
        // The persistent container is available.
    }
}
  • app’s delegate둜 λŒμ•„κ°„ λ’€, application(_:didFinishLaunchingWithOptions:) λ©”μ„œλ“œ λ‚΄μ—μ„œ μ•± 창의 rootViewControllerλ₯Ό μ•±μ˜ 루트 λ·° 컨트둀러 νƒ€μž…μœΌλ‘œ λ‹€μš΄μΊμŠ€νŠΈ 해야함
  • 이 μ°Έμ‘°λ₯Ό μ‚¬μš©ν•˜μ—¬ 루트 λ·° 컨트둀러의 container 속성을 영ꡬ μ»¨ν…Œμ΄λ„ˆλ‘œ 섀정해야함
class AppDelegate: UIResponder, UIApplicationDelegate {
    ...
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {        
        if let rootVC = window?.rootViewController as? ViewController {
            rootVC.container = persistentContainer
        }        
        return true
    }
    ...
}
  • Persistent Containerλ₯Ό 좔가적인 λ·° 컨트둀러둜 μ „λ‹¬ν•˜λ €λ©΄ 각 λ·° μ»¨νŠΈλ‘€λŸ¬μ—μ„œ μ»¨ν…Œμ΄λ„ˆ λ³€μˆ˜λ₯Ό μƒμ„±ν•˜κ³ , 이전 λ·° 컨트둀러의 prepare(for:sender:) λ©”μ„œλ“œμ—μ„œ ν•΄λ‹Ή 값을 섀정해야함
class ViewController: UIViewController {
    ...
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let nextVC = segue.destination as? NextViewController {
            nextVC.container = container
        }
    }
}

πŸ“Œ Subclass the Persistent Container

  • NSPersistentContainerλŠ” μ„œλΈŒν΄λž˜μŠ€ν™”λ  것을 κ³ λ €ν•œ 것
  • λ‹Ήμ‹ μ˜ μ„œλΈŒν΄λž˜μŠ€λŠ” Core Data κ΄€λ ¨ μ½”λ“œλ₯Ό ν¬ν•¨ν•œ 데이터 μ„œλΈŒμ…‹μ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ‚˜, 데이터λ₯Ό λ””μŠ€ν¬μ— μ €μž₯ν•˜λŠ” 호좜과 같은 κΈ°λŠ₯듀을 νŽΈλ¦¬ν•˜κ²Œ μΆ”κ°€ν•  수 μžˆλŠ” μž₯μ†Œμž„
import CoreData

class PersistentContainer: NSPersistentContainer {    

    func saveContext(backgroundContext: NSManagedObjectContext? = nil) {
        let context = backgroundContext ?? viewContext
        guard context.hasChanges else { return }
        do {
            try context.save()
        } catch let error as NSError {
            print("Error: \(error), \(error.userInfo)")
        }
    }    
}
  • μœ„μ˜ μ½”λ“œλŠ” λ³€κ²½ 사항이 μžˆμ„ λ•Œλ§Œ μ»¨ν…μŠ€νŠΈλ₯Ό μ €μž₯ν•˜μ—¬ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€κΈ° μœ„ν•΄ μ»¨ν…Œμ΄λ„ˆμ— saveContext ν•¨μˆ˜λ₯Ό μΆ”κ°€ν•œ μ½”λ“œμž„
  • (note) λͺ¨λΈ λ ˆμ΄μ–΄λ₯Ό 자체 ν”„λ ˆμž„μ›Œν¬λ‘œ 뢄리할 λ•Œ, NSPersistentContainer μ„œλΈŒν΄λž˜μŠ€λŠ” λͺ¨λΈ νŒŒμΌμ„ 자체 λ²ˆλ“€ λ‚΄μ—μ„œ 찾음

μΆœμ²˜πŸ“š

[🍎Apple Docs: Setting up a Core Data stack]
https://developer.apple.com/documentation/coredata/setting_up_a_core_data_stack#overview

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보