1. ホーム
  2. ios

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

2023-09-05 05:39:15

質問

現在、あるプロジェクトを Realm に移行しているところです。特に Realm Browser(とても便利です!)には、今のところ本当に感心しています。

その結果、いくつかの質問が出てきたので、これ以上先に進む前に、いくつかの具体的な使用パターンを書き留めておきたいと思います。私たちのアプリは激しくマルチスレッド化されているので (API 呼び出し、アニメーションなど)、質問を読むときはそのことを念頭においてください。

  • Realm のインスタンスを繰り返し作成することについて、どの程度心配する必要がありますか。オーバーヘッドとは何でしょうか?
  • Realm のインスタンスを ViewController や Singleton に保存しておく必要がありますか? に保持すべきでしょうか?これを試しましたが、インスタンスが異なるスレッドからアクセスされることがあり、毎回新しいインスタンスを作成するように戻さなければなりませんでした。
  • Realm インスタンスのリレーションシップ プロパティにアクセスする場合、読み込まれた結果データはメモリに保持されますか? 読み込まれたデータは、メモリに保持されますか? ディスクから読み込まれるのでしょうか?リレーションシップへの深いアクセスにより、保持される Realm インスタンスが大きくなりすぎることを心配する必要はありますか? が大きくなりすぎる心配はありませんか?
  • Realm インスタンスのリフレッシュはどのような場合に必要ですか?私は、次のことに気づきました。 Realm ブラウザで変更を加えると、リフレッシュを呼び出さなくても保持されている Realm に反映されることに気づきました。
    • ドキュメントによると、各レルムに Auto-Refresh プロパティがあり、これが原因となっているようです。
  • へのアクセスは realm プロパティにアクセスしていますか? Object を使うのは悪い習慣でしょうか?オブジェクトを使用する関数がオブジェクトやRealmを作成しなかった場合、Realmに書き込むためにこれを使用しました(もちろん、同じスレッド上で)。

例えば...

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

ありがとうございました。回答お待ちしております :D

どのように解決するのですか?

(免責事項 私はレルムのために働いています。 今はRealmを離れましたが、まだお役に立てると思います!) :) どうもありがとうございます! Realmを楽しんでいただけているようで、とてもうれしいです!

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

Realm のインスタンスを保持する - 最初のポイントに続いて、他のオブジェクトの中で Realm の参照を保持することを心配する必要はないでしょう。Realm は内部で Realm ファイルオブジェクトを追跡し、同じものを返すので、そうしなくてもペナルティを受けることはないでしょう。とはいえ、Realm オブジェクトへの永続的な参照をオブジェクト内に持つことで、コードの複雑さが軽減されるのであれば、遠慮なく使い続けてください。

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

自動リフレッシュ 自動更新は、デフォルトではメインスレッド上の Realm ファイルオブジェクトに対してのみ有効です。他のスレッド上の Realm ファイルオブジェクトに対しては手動で有効にする必要があり、 その代わりに refresh メソッド呼び出しで手動で更新することができます。

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

オブジェクトの Realm 参照を参照する 絶対にダメです!バッドプラクティスではありません。私は実際に、適切なコンテキストを提供するために Realm を使用する私自身の個人的なアプリケーションでこれを行うことを好みます。なぜなら、常に簡単で、コード内のオブジェクトとその親 Realm ファイル間の視覚的コンテキストをより強力に提供するからです。(ははは、もしここにスレッドの問題があったとしても、おそらく write の点)。


お役に立ったでしょうか?何か不明な点があれば教えてください。