Realm の構成とオープン - SwiftUI
Swift SDK は、SwiftUI 対応の方法で Realm を開くためのプロパティ ラッパーを提供します。
ユーザーは次のアクションを実行できます。
defaultConfiguration
を使用してRealmを暗黙的に開くか、別の構成を指定します。 これは、同期されていない Realm と同期された Realm の両方で機能します。同期された Realm を開く前には、必ず変更をダウンロードしてください。これは、ユーザーがオフラインの場合にタイムアウトします。
ユーザーが オフライン の場合でも、同期された Realm を開きます。 Realm には最新データがない場合があります。
構成を使用して Realm を開きます
@ObservedRealmObjectまたは@ObservedResultsを使用すると、これらのプロパティ ラッパーは暗黙的に Realm を開き、指定されたオブジェクトまたは結果を検索します。
// Implicitly use the default realm's objects(Dog.self) Dog.self) var dogs (
注意
@ObservedResults
プロパティ ラッパーは SwiftUI ビューで使用するためのものです。 ビューモデルで結果を観察するには、変更リスナーを登録します。
構成を指定しない場合、これらのプロパティ ラッパーはdefaultConfigurationを使用します。 defaultConfiguration をグローバルに設定でき、アプリ全体のプロパティ ラッパーはRealmを暗黙的に開くときにその構成を使用できます。
プロパティ ラッパーがRealmを暗黙的に開くために使用する代替構成を提供できます。 SyncConfigurationとローカル構成の両方がある場合など、アプリ内で複数の構成を使用する場合は、これを行うことをお勧めします。 これを行うには、明示的な構成 を作成します。 次に、環境インジェクションを使用して、それぞれの構成を、それらを必要とするビューに渡します。 プロパティ ラッパーが Realm を開くビューに構成を渡すと、 defaultConfiguration
の代わりに渡された構成が使用されます。
同期された Realm を開く
バージョン10.12.0の新機能。
これらの SwiftUI プロパティ ラッパーは、同期された Realm を開き、ビューを入力します。 これらのプロパティ ラッパーの主な違いは、ユーザーがオンラインである必要があるかどうかです。
Realm を開く前に Atlas App Services アプリから更新をダウンロードするには、 @AsyncOpenプロパティ ラッパーを使用します。 これにはユーザーにネットワーク接続が必要です。
ユーザーがネットワーク接続を持っているかどうかに関係なく同期された Realm を開くには、 @AutoOpenプロパティ ラッパーを使用します。 このプロパティ ラッパーにより、開発者はオフライン向けの機能をアプリに設計できます。
Tip
Flexible Sync への移行
App Services Device Sync モードは、パーティションベースの同期から Flexible Sync に自動的に移行できます。 これにより、より表現的かつ粒度の高い Flexible Sync サブスクリプションと権限を活用して、ユーザーが読み書きできる同期データを管理できます。 詳細については、「パーティションベースの同期から Flexible Sync への移行 」を参照してください。
同期された Realm を開始する前に変更をダウンロード
ユーザーが複数のデバイスでプレイできるライブ リーダーボードを持つゲームアプリなど、サーバーからの最新情報を必要とするアプリには、 @AsyncOpenプロパティ ラッパーを使用します。 これにより、ユーザーは古いデータを含むアプリを使用しなくなります。
バージョン10.27.0の新機能。
Realm Swift SDK バージョン10.27.0 は、SwiftUI で Realm を開くために、 Flexible Syncバージョンのプロパティ ラッパーを追加します。 Realm を開くと、 .onAppear
でサブスクライブ クエリを追加できます。
4000) var asyncOpen (appId: flexibleSyncAppId, timeout:
バージョン10.28.0の新機能。
initialSubscriptions
パラメーターを使用してFlexibleSyncConfiguration()を作成できます。 このパラメーターを使用して、 構成でFlexible Sync クエリをサブスクライブできます。 これが複数回実行される場合(たとえば、定期的に再読み込みするビューにある場合)、サブスクリプションを追加する前にサブスクリプションがすでに存在するかどうかを確認してください。 同じサブスクリプションを再度追加すると、エラーがスローされます。
// Create a `flexibleSyncConfiguration` with `initialSubscriptions`. // We'll inject this configuration as an environment value to use when opening the realm // in the next view, and the realm will open with these initial subscriptions. let config = user.flexibleSyncConfiguration(initialSubscriptions: { subs in let peopleSubscriptionExists = subs.first(named: "people") let dogSubscriptionExists = subs.first(named: "dogs") // Check whether the subscription already exists. Adding it more // than once causes an error. if (peopleSubscriptionExists != nil) && (dogSubscriptionExists != nil) { // Existing subscriptions found - do nothing return } else { // Add queries for any objects you want to use in the app // Linked objects do not automatically get queried, so you // must explicitly query for all linked objects you want to include. subs.append(QuerySubscription<Person>(name: "people")) subs.append(QuerySubscription<Dog>(name: "dogs")) } })
次に、環境オブジェクトとしてプロパティ ラッパーを含むビューに構成を渡します。
OpenFlexibleSyncRealmView() .environment(\.realmConfiguration, config)
完全な例については、「 SwiftUI クイック スタート 」を参照してください。
パーティションベースの同期を使用してRealmを開くには、プロパティ ラッパーにpartitionValue
を追加します。
YOUR_APP_SERVICES_APP_ID_HERE, partitionValue: "", timeout: 4000) var asyncOpen (appId:
この SwiftUI プロパティ ラッパーは、現在のユーザーに対してRealm.asyncOpen()
を開始します。 プロパティ ラッパーは、ビューをアップデートするために使用できるAsyncOpenState 列挙によって表される状態を公開します。
例
この例では、 @AsyncOpen
を使用してビュー内で Realm を開く方法の 1 つを示しています。 まず、ユーザーを確認するか、ログインします。 次に、 AsyncOpenState
に切り替えて、Realm を開き、適切なビューを表示します。 Realm が正常に開いたら、それを環境値として挿入してビューに入力します。
/// 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. 4000) var asyncOpen (appId: flexibleSyncAppId, timeout: 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) } } }
/// This view opens a synced realm. struct OpenPartitionBasedSyncRealm: View { // @AsyncOpen attempts to connect to the server and download remote changes // before the realm opens. If there is no network connection, // AsyncOpen cannot load changes and the realm does not open. // We can use an empty string as the partitionValue here because we're // injecting the user.id as an environment value from the LoginView. YOUR_APP_SERVICES_APP_ID_HERE, partitionValue: "", timeout: 4000) var asyncOpen (appId: 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 をオフラインで開く
@AsyncOpen
と同様に、 @AutoOpenは Realm を開く前に更新をダウンロードしようとします。 ただし、ネットワーク接続が利用できない場合、このメソッドは代わりにデバイス上のデータを含むRealmを開きます。
このプロパティ ラッパーは、ユーザーがデバイス上のデータを操作できる必要があるアプリなど、ユーザーが古い可能性のあるデータを操作するのに問題がないアプリに使用します。
"app_id") var autoOpen (appId:
"app_id", partitionValue: <partition_value>) var autoOpen (appId:
この SwiftUI プロパティ ラッパーは、現在のユーザーの Realm を開く前に更新をダウンロードしようとします。 インターネット接続がない場合、このプロパティ ラッパーは代わりに、指定されたappId
および Flexible Sync または パーティションベースの同期 構成のローカル Realm ファイルの最新バージョンを返します。
プロパティ ラッパーは、ビューをアップデートするために使用できるAsyncOpenState 列挙によって表される状態を公開します。 完全な例については、上記の@AsyncOpen
コード例を参照してください。