Docs Menu
Docs Home
/ /
Atlas Device SDK

クイック スタート - Swift SDK

項目一覧

  • Realm のインポート
  • オブジェクトモデルを定義する
  • Realm を開く
  • オブジェクトの作成、読み取り、更新、削除
  • 変更の監視
  • Device Sync の追加(任意)
  • 前提条件
  • アプリを初期化する
  • ユーザーの認証
  • Realm を開く

このクイック スタートでは、Realm Swift SDK で Realm を使用する方法を説明します。 開始する前に、 Swift SDK がインストールされていることを確認してください。

Tip

以下も参照してください。

アプリで SwiftUI を使用している場合は、 SwiftUI クイック スタートを確認してください。

Realm を使用する Swift ファイルの先頭に、次のインポート ステートメントを追加します。

import RealmSwift

ローカル専用 Realm の場合は、コード内でオブジェクトモデルを直接定義できます。 このクイック スタートでは、オプションの Device Sync を追加する場合を除き、 ownerIdを削除できます。

class Todo: Object {
@Persisted(primaryKey: true) var _id: ObjectId
@Persisted var name: String = ""
@Persisted var status: String = ""
@Persisted var ownerId: String
convenience init(name: String, ownerId: String) {
self.init()
self.name = name
self.ownerId = ownerId
}
}

ローカル専用の 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()

デバイス間で Realm データを同期する場合は、Atlas App Services App を設定し、Device Sync を有効にします。 App Services で実行できる操作の詳細については、「 App Services - Swift SDK 」を参照してください。

Realm データを同期する前に、次の操作を行う必要があります。

  • App Services アプリの作成

  • 匿名認証を有効にする

  • セクションで、 開発モード が と フィールドに切り替えられている状態で Flexible SyncOnownerIdQueryable 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 」を参照してください。

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.
@MainActor
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 に書き込まれるため、同期のパフォーマンスが向上します。

次へ

Atlas Device SDK Docsへようこそ