Atlas へのデータのストリーム - Swift SDK
Overview
バージョン 10.29.0 の新機能。
Data Ingestを使用して、クライアント アプリケーションから Flexible Sync が有効化されている Atlas App Services アプリにデータをストリーミングできます。
クラウドにデータを送信する気象センサーなど、IoT アプリケーションでデータを一方向に同期したい場合があります。 Data Ingest は、小売アプリからの請求書作成や、アプリケーション イベントのログ記録など、競合の解決を必要としない他のタイプの不変データを書き込む場合にも役立ちます。
Data Ingest は、クライアント側の挿入専用ワークロードのパフォーマンスを向上させるために最適化されています。
クライアント アプリケーションから一方向にデータを同期
非対称オブジェクトの定義
そのオブジェクトが AsymmetricObject
である場合は、データを一方向に同期できます。 AsyncMongoDB から派生して非対称オブジェクトを定義します。
class WeatherSensor: AsymmetricObject { true) var _id: ObjectId (primaryKey: var deviceId: String var temperatureInFahrenheit: Float var barometricPressureInHg: Float var windSpeedInMph: Int }
AsymmetricObject
を定義する方法の詳細については、「非対称オブジェクトの定義 」を参照してください。
App Services Appによる接続と認証
クライアントからバックエンド アプリにデータをストリーミングするには、App Services バックエンドに接続し、ユーザーを認証する必要があります。
let app = App(id: INSERT_APP_ID_HERE) do { let user = try await login() await openSyncedRealm(user: user) } catch { print("Error logging in: \(error.localizedDescription)") } func login() async throws -> User { let user = try await app.login(credentials: .anonymous) return user }
Data Ingest は Flexible Sync の機能であるため、接続するアプリはFlexible Sync を使用する必要があります。
Realm を開く
認証されたユーザーを取得したら、 FlexibleSyncConfiguration()を使用して同期された Realm を開くことができます。 同期するAsymmetricObject
タイプを指定します。
func openSyncedRealm(user: User) async { do { var asymmetricConfig = user.flexibleSyncConfiguration() asymmetricConfig.objectTypes = [WeatherSensor.self] let asymmetricRealm = try await Realm(configuration: asymmetricConfig) await useRealm(asymmetricRealm, user) } catch { print("Error opening realm: \(error.localizedDescription)") } }
双方向同期とは異なり、Data Ingest はFlexible Sync サブスクライブを使用しません。
注意
プロジェクトにおける同期された Realm と非同期 Realm
AsymmetricObject
タイプは同期されていない Realm と互換性がありません。 プロジェクトで同期された Realm と同期されていない Realm の両方を使用する場合は、Realm 構成でクラスのサブセットを明示的に渡して、同期されていない Realm からAsymmetricObject
を除外する必要があります。
自動スキーマ検出では、構成からAsymmetricObject
を明示的に除外せずに同期されていない Realm を開くと、互換性のないオブジェクトタイプの使用に関連するエラーがスローされる可能性があります。
非対称オブジェクトの作成
Realm が開いたら、 create(_ type:, value:)を使用して書き込みトランザクション内にAsymmetricObject
を作成できます。
func useRealm(_ asymmetricRealm: Realm, _ user: User) async { try! asymmetricRealm.write { asymmetricRealm.create(WeatherSensor.self, value: [ "_id": ObjectId.generate(), "deviceId": "WX1278UIT", "temperatureInFahrenheit": 66.7, "barometricPressureInHg": 29.65, "windSpeedInMph": 2 ]) } }
これらのオブジェクトは読み取れません。 作成が完了すると、App Services バックエンドとリンクされた Atlas データベースに同期されます。
Atlas Device Sync は、このデータのライフサイクルを完全に管理します。 Data Ingest 同期が完了するまでデバイス上に保持され、その後デバイスから削除されます。