クイック スタート - Swift SDK
項目一覧
このクイック スタートでは、Realm Swift SDK で Realm を使用する方法を説明します。 開始する前に、 Swift SDK がインストールされていることを確認してください。
Realm のインポート
Realm を使用する Swift ファイルの先頭に、次のインポート ステートメントを追加します。
import RealmSwift
オブジェクトモデルを定義する
ローカル専用 Realm の場合は、コード内でオブジェクトモデルを直接定義できます。 このクイック スタートでは、オプションの Device Sync を追加する場合を除き、 ownerId
を削除できます。
class Todo: Object { true) var _id: ObjectId (primaryKey: var name: String = "" var status: String = "" var ownerId: String convenience init(name: String, ownerId: String) { self.init() self.name = name self.ownerId = ownerId } }
Realm を開く
ローカル専用の Realm で Realm を開く最も簡単なオプションは、構成パラメータのないデフォルトの Realm を使用することです。
// Open the local-only default realm let realm = try! Realm()
また、 Realm.Configurationパラメータを指定して、特定のファイル URL、メモリ内、またはクラスのサブセットで Realm を開くこともできます。
詳細については、「 Realm の構成とオープン 」を参照してください。
オブジェクトの作成、読み取り、更新、削除
Realm を開くと、 書込みトランザクション ブロックでそのオブジェクトとその オブジェクト を変更できます。
新しい Todo オブジェクトを作成するには、Todo クラスをインスタンス化し、それを書込みブロックの Realm に追加します。
let todo = Todo(name: "Do laundry", ownerId: user.id) try! realm.write { realm.add(todo) }
Realm 内のすべての Todo のライブコレクションを取得できます。
// Get all todos in the realm let todos = realm.objects(Todo.self)
次の条件を使用してそのコレクションをフィルタリングすることもできます。
let todosInProgress = todos.where { $0.status == "InProgress" } print("A list of all todos in progress: \(todosInProgress)")
Todo を変更するには、書込みトランザクション (write transaction) ブロックでそのプロパティを更新します。
// All modifications to a realm must happen in a write block. let todoToUpdate = todos[0] try! realm.write { todoToUpdate.status = "InProgress" }
最後に、Todo を削除できます。
// All modifications to a realm must happen in a write block. let todoToDelete = todos[0] try! realm.write { // Delete the Todo. realm.delete(todoToDelete) }
変更の監視
observe
メソッドを使用して、Realm、コレクション、またはオブジェクトの変更を監視できます。
// Retain notificationToken as long as you want to observe let notificationToken = todos.observe { (changes) in switch changes { case .initial: break // Results are now populated and can be accessed without blocking the UI case .update(_, let deletions, let insertions, let modifications): // Query results have changed. print("Deleted indices: ", deletions) print("Inserted indices: ", insertions) print("Modified modifications: ", modifications) case .error(let error): // An error occurred while opening the Realm file on the background worker thread fatalError("\(error)") } }
監視を継続する限り、 observe
によって返された通知トークンを保持するようにしてください。 監視が完了したら、トークンを無効にしてリソースを解放します。
// Invalidate notification tokens when done observing notificationToken.invalidate()
Device Sync の追加(任意)
デバイス間で Realm データを同期する場合は、Atlas App Services App を設定し、Device Sync を有効にします。 App Services で実行できる操作の詳細については、「 App Services - Swift SDK 」を参照してください。
前提条件
Realm データを同期する前に、次の操作を行う必要があります。
セクションで、 開発モード が と フィールドに切り替えられている状態で Flexible Sync
On
ownerId
Queryable Fields を有効にします。
アプリを初期化する
認証や同期などの App Services 機能を使用するには、App ID を使用して App Services App にアクセスします。 アプリ ID は、App Services UI で確認できます。
let app = App(id: APP_ID) // Replace APP_ID with your Atlas App ID
ユーザーの認証
このクイック スタートでは、匿名認証を使用してユーザーをログインさせ、識別情報の提供を要求しません。 ユーザーを認証したら、そのユーザーのRealmを開くことができます。
do { let user = try await app.login(credentials: Credentials.anonymous) print("Successfully logged in user: \(user)") await openSyncedRealm(user: user) } catch { print("Error logging in: \(error.localizedDescription)") }
Realm Swift SDK は、ユーザーを認証、登録、リンクするための多くの追加の方法を提供します。 その他の認証プロバイダについては、「ユーザーの認証 - Swift SDK 」を参照してください。
Realm を開く
Device Sync を有効にしてユーザーを認証したら、構成オブジェクトを作成し、Realm を開くことができます。 次に、Realm が読み書きできるデータを決定するFlexible Sync サブスクリプションを追加できます。
サブスクリプションを持つ Realm が作成されると、この例では Realm とユーザーを別の関数に渡し、Realm を使用できるようにします。
Tip
アプリがasync/await
コンテキストで Realm にアクセスする場合は、スレッド関連のクラッシュを回避するためにコードを@MainActor
でマークします。
// Opening a realm and accessing it must be done from the same thread. // Marking this function as `@MainActor` avoids threading-related issues. func openSyncedRealm(user: User) async { do { var config = user.flexibleSyncConfiguration() // Pass object types to the Flexible Sync configuration // as a temporary workaround for not being able to add a // complete schema for a Flexible Sync app. config.objectTypes = [Todo.self] let realm = try await Realm(configuration: config, downloadBeforeOpen: .always) // You must add at least one subscription to read and write from a Flexible Sync realm let subscriptions = realm.subscriptions try await subscriptions.update { subscriptions.append( QuerySubscription<Todo> { $0.ownerId == user.id }) } await useRealm(realm: realm, user: user) } catch { print("Error opening realm: \(error.localizedDescription)") } }
同期された Realm で を読み取り、書込み、変更を監視する構文は、上記の同期されていない Realm の構文と同じです。 ローカル データを操作している間に、バックグラウンド スレッドが変更セットを効率的に統合、アップロード、ダウンロードします。
サブスクリプションセットのすべての書込みトランザクション (write transaction) にはパフォーマンス コストがかかります。 セッション中に Realm オブジェクトを複数更新する必要がある場合は、すべての変更が完了するまで編集されたオブジェクトをメモリ内に保持することを検討してください。 これにより、すべての変更ではなく、完全で更新されたオブジェクトのみが Realm に書き込まれるため、同期のパフォーマンスが向上します。