Hacking with Swift 사이트의 강좌 번역본입니다.
[원문 : https://www.hackingwithswift.com/quick-start/swiftui/how-to-configure-core-data-to-work-with-swiftui]
How to configure Core Data to work with SwiftUI
새로운 프로젝트를 만들고 SwiftUI와 Core Data 모두 체크하는 경우, Xcode는 작업 구성하는데 꽤 도움이 됩니다. 구체적인 것은 다음과 같습니다.
- 비어있는 YourProjectName.xcdatamodelId 모델 파일을 만듭니다.
- app delegate에 lazy 프로퍼티로 모델 파일을 컨테이너로 불러오는 persistentContainer를 추가 합니다.
- 변경사항을 확인하고 필요한 경우에 저장하는 saveContext() 메소드를 app delegate에 추가합니다.
- managedObjectContext 키를 사용해서 해당 컨텍스트를 초기화 컨텐츠 뷰의 environment로 삽입합니다.
- scene delegate의 sceneDidEnterbackground() 메소드에서 saveContext() 메소드를 호출하고, scene이 백그라운드(background)으로 이동될때 Core Data 업데이트가 처리(flushed)되는 것을 보장합니다.
SwiftUI에서 Core Data 가져오기 요청을 사용할 수 있는 완벽한 기능을 제공하지만, 여전히 작업할 예제 데이터를 추가해야 합니다.
하지만, Core Data 템플릿을 사용하지 않거나 Core Data 템플릿이 무엇을하는지 궁금한 경우에, 앱에서 이를 지원하도록 설정하는데 필요한 단계를 간단하게 다루는 것이 좋습니다. 이 책의 다음 장에서 시도해 볼수 있는 간단한 샘플 데이터를 제공할 것입니다.
Core Data 모델을 만드는 첫번째 단계는 Cmd+N을 눌러서 새로운 파일을 만들고, Data Model을 선택합니다. 코드에서 바로 사용되기 때문에, 모델의 이름은 중요합니다. 모델이 있으면 계속해서 앱에서 사용할 요소들(entities)를 만들 수 있습니다.
두번째, app delegate에 있는 app 내부로 Core Data 모델을 불러와야 하고, 오류를 적절하게 처리해야 합니다. AppDelegate.swift에서 다음과 같은 것을 수행해야 합니다.
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "CoreDataModelNameHere")
container.loadPersistentStores { description, error in
if let error = error {
// Add your error UI here
}
}
return container
}()
세번째, app delegate에 saveContext() 메소드를 추가하므로, 컨텍스트(context)가 변경사항이 있는지 확인하고 필요한 경우에 커밋(commits) 합니다.
func saveContext () {
let context = persistentContainer.viewContext
if context.hasChanges {
do {
try context.save()
} catch {
// Show the error here
}
}
}
네번째, Core Data 컨테이너에 대한 관리 객체 컨텍스트를 SwiftUI environment에 삽입합니다. 내가 아는한 이보다 더 좋은 방법은 없고, 해당 코드는 Apple에서 사용하는 코드는 아마도 몇몇 사람들을 놀라게 할 것입니다.
Apple의 코드를 사용하기 위해서, SceneDelegate.swift 파일을 열고, ContentView 인서턴스를 작성하는 곳을 찾고, 다음과 같이 수정합니다
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let contentView = ContentView().environment(\.managedObjectContext, context)
네, 앱 delegate가 AppDelegate로 강제로 캐스팅(casts) 되지만, 현실적으로 다음과 같이 하는게 가장 좋은 방법(alternative)입니다.
guard let context = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext else {
fatalError("Unable to read managed object context.")
}
여전히 타입 캐스팅이 실패하는 경우 코드는 크래쉬(crash)가 날것이지만, 최소한 오류를 설명할 기회를 제공합니다.
마지막으로, secene가 백그라운드(background)로 이동될때 Core Data를 저장하도록 만듭니다.
func sceneDidEnterBackground(_ scene: UIScene) {
(UIApplication.shared.delegate as? AppDelegate)?.saveContext()
}
이제 Core Data는 의미있는 결과를 얻기 위해 환경설정(configuration)하는 것이 필요하기 때문에, Core Data 섹션에 있는 모든 장(chapters)에서 반복되지 않는 공유된 환경설정을 사용합니다.
우선, SwiftUI와 Core Data를 모두 지원하는 새로운 Single View App을 만들거나, Core Data를 사용하지 않는것으로 Single View App으로 만들고 위의 설명대로해서 새로 지원되도록 만듭니다.
xcdatamodelId 파일을 열고 2개의 문자열 속성을 가진 ProgrammmingLanguage 라는 요소(entity)를 만듭니다: name과 creator. 확실히 요소(entity)와 속성(attribute) 집합을 가질 필요가 없으므로, Core Data 설정 예제을 마음대로 교체합니다.
마지막으로, 데이터 모델 검사기(inspector)에서 Codegen을 Class Definition이 되도록 변경해주세요 - SwiftUI로 함게 사용할 수 있는 Language 클래스를 만들 것입니다.
중요 : 해당 지침(instructions)이 중요합니다!
혼란을 피하기 위해, 위의 지침이 SwiftUI에 대한 유용한 Core Data environment를 설정하는 것이 중요하다는 것을 반복하고자 합니다. 이후의 모든 Core Data 장(chapers)에서는 위의 지침을 따른다고 가정합니다.
'개발 > SwiftUI' 카테고리의 다른 글
How to add Core Data objects from SwiftUI views (0) | 2019.12.03 |
---|---|
How to filter Core Data fetch requests using a predicate (0) | 2019.12.03 |
How to create a Core Data fetch request using @FetchRequest (0) | 2019.12.03 |
How to access a Core Data managed object context from a SwiftUI view (0) | 2019.12.03 |
Introduction to using Core Data with SwiftUI (0) | 2019.12.02 |
How to read the Digital Crown on watchOS using digitalCrownRotation() (0) | 2019.12.02 |
How to make carousel lists on watchOS (0) | 2019.12.02 |
How to get translucent lists on macOS (0) | 2019.12.02 |