2017-08-08 14 views
0

で共有レルムに同期されたオブジェクトがどのように、私は最近、(私のアプリのすべてのユーザーにグローバルに利用)共有領域のみRealm.asyncOpenで照会することができることを学びました。たとえば、すべてのユーザーに読み取り専用アクセス権を持つ/shared領域があります。通常の方法でクエリを実行しようとしましたが、ゼロオブジェクトが返されました。私はこのようにそれを照会場合しかし、それは動作します:は<a href="https://realm.io/docs/swift/latest/#permission-denied-errors" rel="nofollow noreferrer">the documentation</a>を精練した後スウィフト

Realm.asyncOpen(configuration: sharedConfig) { realm, error in 
    if let realm = realm { 
    // Realm successfully opened 
    self.announcements = realm.objects(Announcement.self) 

    print(self.announcements) 
    self.tableView.reloadData() 

    } else if let error = error { 
    print(error) 
    } 
} 

それは、サーバの代わりに、ローカル、既に同期領域からデータをフェッチしているように見えるため、この方法は、通常のレルムクエリよりも目に見えて遅くなります。

プルダウンされたオブジェクトは、レルムのローカルコピーに格納されることはありませんが、アクセスするたびにROSから照会されることを意味しますか?

つまり、共有領域がプルされ、同期されていませんか? (私のアプリのすべてのユーザーにグローバルに利用)

答えて

1

共有領域はこれは間違っていRealm.asyncOpen

で照会することができます。ユーザーが読み取り専用のレルムにアクセスする場合は、Realm.asyncOpenで取得する必要があります。それは明白に何かdocumentation you linked to statesです。

この方法は、ローカルのすでに同期されているレルムではなく、サーバーからデータをフェッチしているように見えるため、通常のレルムクエリよりも表示が遅くなります。

ほぼ正しい。はいデータはサーバーからフェッチされますが、レルム全体が最初からフェッチされるわけではありません。レルムがローカルコピーと最後に同期されて以降の新しいデータのみ。

これは、オブジェクトがプルダウン領域のローカルコピーに格納されることはありませんが、ROSから、私はそれらにアクセスするたびに照会することを意味するのでしょうか?

この同期レルムはローカルに保持され、アプリケーションの起動時にも保持されます。

つまり、共有レルムがプルされていて、同期されていませんか?バックステップを取る


、のは、ここで何が起こっているか説明しましょう。

読み取り専用の同期レルムを同期して開こうとすると、「アクセス権が拒否されました」というエラーが発生する理由は、初期化時にローカルのレルムファイルが作成され、レルムのスキーマdbテーブルの作成、列&メタデータ)ただし、ユーザーにはレルムへの書き込みアクセス権がないため、レルムオブジェクトサーバー(ROS)は変更を拒否し、ユーザーがファイルを変更しようとしたことを通知するグローバルエラーハンドラーをトリガーします。

これはasyncOpenと起こらない理由は、それは、非同期操作ですので、すぐにあなたにを有効レルムを与える必要がないということですので、それは書くことによって、それを「ブートストラップ」する必要はありません。それに対するスキーマ。代わりに、ROSからRealmの最新の状態を要求し、呼び出しが開始された時点で最新の状態で完全に使用可能になったら、それを元に戻します。

Realmのローカルコピーにすでにスキーマが初期化されている場合(つまり、成功した場合はasyncOpen呼び出し後)、デフォルトスキーマまたはRealm.Configurationで指定されたカスタムオブジェクト型のいずれかによって定義されたメモリ内スキーマhasn変更されていない場合、スキーマはファイルに書き込まれません。

これは、成功したasyncOpenコールの後いつでも、ROSの最新のデータを持っていない可能性がある場合は、asyncOpenを通らずに同期してRealmにアクセスできることを意味します。

したがって、あなたはレルムへの最初のアクセスにasyncOpenだけを使用するように見えるので、その状態を(別のレルムまたはNSUserDefaultsを使用して)持続させることができます。レルムを非同期にまたは同期して開かないようにします。

+0

偉大な答え、ありがとうございます。世界全体を書き込み可能にするだけで、この問題を回避できますか?私のアプリケーションは領域への書き込みの仕組みを提供しないため、セキュリティの意味には関心がありません。 –

+0

はい、レルムがグローバルに書き込み可能な場合はこの問題は発生しませんが、私が概説した解決策はアクセス制御モデルを犠牲にするほど面倒ではないと思っていますが、それはあなたの呼び出しです。 – jpsim

+0

Hmm ...この '/ shared'レルムが' asyncOpen'で初期化された後も、 'NotificationToken'を使って変更をリッスンして、通常のレルムと同様にやり取りすることができますか?私はスキーマの変更を取得するために 'asyncOpen'が必要です。 –

関連する問題

 関連する問題