web-dev-qa-db-ja.com

適切なレルムの使用パターン/ベストプラクティスですか?

Realmを使用するようにプロジェクトを変換しています。これまでのところ、特にRealm Browserに感銘を受けています(とても便利です!)。

その結果、いくつかの質問が出てきたので、先に進む前に具体的な使用パターンを下げたいと思います。私たちのアプリは非常にマルチスレッド(API呼び出し、アニメーションなど)なので、質問を読むときは注意してください。レルムインスタンスはスレッド間で(現在)アクセスできないことがわかっているからです。

  • レルムのインスタンスを繰り返し作成することについて、どのくらい心配する必要がありますか?オーバーヘッドとは何ですか?
  • 繰り返し使用するために、ViewControllersまたはSingletonsでRealmインスタンスを保持する必要がありますか?これを試しましたが、インスタンスが異なるスレッドからアクセスされることがあるため、毎回新しいインスタンスの作成に戻る必要がありました。
  • レルムインスタンスの関係プロパティにアクセスする場合、読み取られる結果データはメモリに保持されますか、それとも毎回ディスクから読み取られますか?深い関係へのアクセスにより、保持されているRealmインスタンスが大きくなりすぎることを心配する必要がありますか?
  • レルムインスタンスの更新はいつ必要ですか? Realmブラウザで変更を加えると、更新を呼び出さずに保持されているRealmに反映されることに気付きました。
    • ドキュメントによると、これを引き起こす各レルムにAuto-Refreshプロパティがあるように見えます。
  • realmObjectプロパティにアクセスするのは悪い習慣ですか?オブジェクトを使用する関数がオブジェクトまたはレルム(同じスレッド上で)を作成しなかった場合、これをレルムへの書き込みに使用しました。

例えば...

func saveStuff(thingToUpdate: Object?) {
   if let thingToUpdate = thingToUpdate, let realm = thingToUpdate.realm {
       realm.write {
           thingToUpdate.name = "lionpants"
       }
   }    
}

前もって感謝します。あなたの答えを楽しみにしています。 :D

72
lionpants

(免責事項: 私はレルムで働いています。 私は今レルムを離れましたが、私はまだ助けてうれしいです!):)どうもありがとう! Realmを楽しんでいると聞いてうれしいです!

Multiple Realm Instances-これについて心配する必要はまったくありません!レルムファイルオブジェクトは、各スレッドで最初にインスタンス化されたときに作成され、その後、毎回それを試行してインスタンス化するたびに、同じオブジェクトが返されます。

Realmインスタンスの保持-最初のポイントから続けて、いいえ、Realmに固執する必要はありません他のオブジェクト内の参照。 RealmはRealmファイルオブジェクトを内部的に追跡し、同じオブジェクトを返すため、そうしないことでペナルティを受けることはありません。そうは言っても、オブジェクト内のRealmオブジェクトへの永続的な参照がコードの複雑さを単純化するのであれば、それを使い続けてください。

レルムリレーションシッププロパティへのアクセス-厳密に言えば、レルムファイルのデータはディスクからコピーされません(通常のORMのように);さらに、メモリマッピングを使用して、ディスクのデータを直接メモリ内プロパティに直接参照します。したがって、いいえ、Realmファイルがメモリで大きくなりすぎることを心配する必要はありません。

Auto-refresh 自動更新は、メインスレッドのRealmファイルオブジェクトに対してデフォルトでのみ有効になっています。他のスレッドのRealmファイルオブジェクトに対して手動で有効にする必要があります。または、代わりにrefreshメソッド呼び出しで手動で更新することを選択できます。

編集:私は修正済みです!複数のスレッド上のすべてのRealmファイルオブジェクトは、デフォルトでautorefreshがオンになっています。 autorefreshがオンの場合、refreshを呼び出す必要があるのは、実行ループの現在の反復が完了する前に、Realmファイルに加えられた変更を他の参照に反映する必要がある場合だけです。完了しました。

オブジェクトのレルム参照を参照する絶対にそうではなく、悪い習慣ではありません!実際には、Realmを使用して適切なコンテキストを提供する個人用アプリでこれを行うことを好みます。なぜなら、常に簡単であり、コード内のオブジェクトとその親Realmファイルの間に強力な視覚的コンテキストを提供するからです。 (はい、はい、ここでスレッドの問題があった場合は、おそらくwriteポイントに到達する前に発見したでしょう)。


お役に立てばと思います!ここで何か説明が必要な場合はお知らせください!

82
TiM