Docs Menu
Docs Home
/ /
Atlas Device SDK
/ / /

객체 모델 변경 - SwiftUI

이 페이지의 내용

  • 개요
  • SwiftUI와 함께 마이그레이션된 데이터 사용
  • 기본 구성 설정
  • 구성 객체를 환경 객체로 전달
  • 업데이트된 구성을 Realm SwiftUI 속성 래퍼(wrapper)에 명시적으로 전달

참고

동기화된 Realm의 스키마 속성 수정

다음 페이지에서는 로컬 영역 의 스키마 속성을 수정하는 방법을 설명합니다. 동기화된 영역 의 스키마 속성을 수정하는 방법을 알아보세요.

객체 스키마를 업데이트할 때는 스키마 버전을 높이고 마이그레이션을 수행해야 합니다. 앱의 주요 버전 릴리스 사이에 객체 스키마를 업데이트할 수 있습니다.

실제로 마이그레이션 을 수행하는 방법에 대한 자세한 내용 은 객체 모델 변경을 참조하세요.

이 페이지에서는 SwiftUI View에서 마이그레이션된 데이터를 사용하는 방법에 중점을 둡니다.

마이그레이션을 수행하려면 다음을 수행합니다.

  • 필요한 경우 스키마 를 업데이트하고 마이그레이션 차단 을 쓰기 (write) 합니다.

  • Realm을 초기화할 때 이 마이그레이션 로직 및/또는 업데이트된 스키마 버전을 사용하는 Realm.Configuration을 지정합니다.

여기에서 구성 객체를 전달할 수 있는 몇 가지 옵션이 있습니다. 다음을 수행할 수 있습니다.

  • 구성을 기본 구성으로 설정합니다. 환경 주입 또는 매개변수를 통해 구성을 명시적으로 전달하지 않으면 속성 래퍼가 기본 구성을 사용합니다.

  • 환경 삽입을 사용하여 Realm 을 사용하는 계층 구조의 첫 번째 뷰에 이 구성을 제공합니다.

  • @ObservedResults 또는 @AsyncOpen 와 같은 구성 객체를 사용하는 Realm 속성 래퍼에 구성을 명시적으로 제공합니다.

예시

예를 예시 , 기존 객체 에 속성 을 추가할 수 있습니다. DoggoDB의 Dog 객체 에 favoriteTreat 속성 을 추가할 수 있습니다.

@Persisted var favoriteTreat = ""

스키마 에 새 속성 을 추가한 후에는 스키마 버전을 증가시켜야 합니다. Realm.Configuration 는 다음과 같습니다.

let config = Realm.Configuration(schemaVersion: 2)

이 구성을 필요로 하는 계층 구조의 첫 번째 뷰에서 액세스할 수 있는 어딘가에 이 구성을 선언합니다. 이를 @main 앱 진입점 위에 선언하면 모든 곳에서 사용할 수 있지만 영역 을 처음 여는 파일 에 넣을 수도 있습니다.

다른 Realm Swift 앱 과 동일하게 SwiftUI 앱 에서 기본값 구성을 설정하다 수 있습니다. 새 Realm.Configuration 인스턴스 를 Realm 영역 인스턴스에 할당하여 기본값 Realm 구성을 설정합니다. 클래스 속성.

// Open the default realm
let defaultRealm = try! Realm()
// Open the realm with a specific file URL, for example a username
let username = "GordonCole"
var config = Realm.Configuration.defaultConfiguration
config.fileURL!.deleteLastPathComponent()
config.fileURL!.appendPathComponent(username)
config.fileURL!.appendPathExtension("realm")
let realm = try! Realm(configuration: config)

구성을 선언한 후에는 Realm을 여는 계층 구조의 첫 번째 뷰에 환경 객체로 구성을 주입할 수 있습니다. @ObservedResults 또는 @ObservedRealmObject 속성 래퍼(wrapper)를 사용하는 경우 이러한 뷰는 암시적으로 Realm을 열기 때문에 이 구성에 대한 액세스도 필요합니다.

.environment(\.realmConfiguration, config)

앱 이 로컬 또는 동기화된 영역 을 사용하는 경우 계층 구조에서 영역 을 여는 첫 번째 보기는 동기화 유무에 관계없이 앱 을 사용하는지 여부에 따라 달라집니다.

동기화를 사용하지 않으면 Realm 구성 환경 객체를 LocalOnlyContentView 에 직접 전달할 수 있습니다.

.environment(\.realmConfiguration, config)

다음을 사용하여 암시적으로 영역 을 엽니다.

struct LocalOnlyContentView: View {
// Implicitly use the default realm's objects(Dog.self)
@ObservedResults(Dog.self) var dogs
var body: some View {
if dogs.first != nil {
// If dogs exist, go to the DogsView
DogsView()
} else {
// If there is no Dog object, add one here.
AddDogView()
}
}
}

그러나 앱에서 동기화를 사용하는 경우 Realm은 @AsyncOpen 또는 @AutoOpen 속성 래퍼(wrapper)를 명시적으로 사용합니다.

/// This view opens a synced realm.
struct OpenFlexibleSyncRealmView: View {
// We've injected a `flexibleSyncConfiguration` as an environment value,
// so `@AsyncOpen` here opens a realm using that configuration.
@AsyncOpen(appId: flexibleSyncAppId, timeout: 4000) var asyncOpen
var body: some View {
switch asyncOpen {
// Starting the Realm.asyncOpen process.
// Show a progress view.
case .connecting:
ProgressView()
// Waiting for a user to be logged in before executing
// Realm.asyncOpen.
case .waitingForUser:
ProgressView("Waiting for user to log in...")
// The realm has been opened and is ready for use.
// Show the content view.
case .open(let realm):
// Do something with the realm
UseRealmView(realm: realm)
// The realm is currently being downloaded from the server.
// Show a progress view.
case .progress(let progress):
ProgressView(progress)
// Opening the Realm failed.
// Show an error view.
case .error(let error):
ErrorView(error: error)
}
}
}

따라서 Realm을 명시적으로 여는 뷰에 환경 객체를 전달해야 합니다. 이 경우 OpenFlexibleSyncRealmView 입니다.

기억해야 할 중요한 점은 마이그레이션 로직을 포함하는 Realm.Configuration 를 암시적 또는 명시적으로 영역 을 여는 모든 뷰 계층 구조에 전달해야 한다는 것입니다.

@ObservedResults 또는 @AutoOpen 와 같은 구성 객체를 사용하는 Realm SwiftUI 속성 래퍼에 구성 객체를 명시적으로 전달할 수 있습니다. 이 경우 DogsView@ObservedResults 에 직접 전달할 수 있습니다.

// Use a `config` that you've passed in from above.
@ObservedResults(Dog.self, configuration: config) var dogs

돌아가기

Realm 객체 모델