Richtige Realm-Nutzungsmuster / Best Practices?

76

Wir sind gerade dabei, ein Projekt auf Realm umzustellen. Wir sind bisher sehr beeindruckt, besonders vom Realm Browser (so praktisch!).

Infolgedessen sind einige Fragen aufgetaucht, und wir möchten einige konkrete Verwendungsmuster festlegen, bevor wir fortfahren. Unsere App ist stark multithreaded (API-Aufrufe, Animationen usw.). Denken Sie also beim Lesen der Fragen daran, da ich weiß, dass auf Realm-Instanzen (derzeit) nicht threadsübergreifend zugegriffen werden kann.

  • Wie besorgt sollten wir uns sein, wiederholt Instanzen von Realm zu erstellen? Was ist der Overhead?
  • Sollten wir uns die Mühe machen, Realm-Instanzen in ViewControllern oder Singletons für die wiederholte Verwendung beizubehalten? Wir haben dies versucht, aber manchmal wird auf die Instanzen von verschiedenen Threads aus zugegriffen, sodass wir jedes Mal wieder eine neue Instanz erstellen mussten.
  • Werden beim Zugriff auf Beziehungseigenschaften in Realm-Instanzen die resultierenden Daten, die gelesen werden, im Speicher gespeichert oder jedes Mal von der Festplatte gelesen? Müssen wir uns Sorgen machen, dass beibehaltene Realm-Instanzen aufgrund des tiefen Beziehungszugriffs zu groß werden?
  • Wann ist eine Aktualisierung einer Realm-Instanz erforderlich? Ich habe festgestellt, dass Änderungen im Realm-Browser in einem beibehaltenen Realm angezeigt werden, ohne die Aktualisierung aufzurufen.
    • Es sieht so aus, als ob es in jedem Bereich eine Auto-Refresh-Eigenschaft gibt, die dies gemäß der Dokumentation verursacht.
  • Ist der Zugang zum realmGrundstück eine Objectschlechte Praxis? Wir haben dies zum Schreiben in ein Realm verwendet, wenn die Funktion, die das Objekt verwendet, weder das Objekt noch das Realm erstellt hat (natürlich im selben Thread).

Zum Beispiel...

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

Danke im Voraus. Ich freue mich auf Ihre Antworten. : D.

Löwenhosen
quelle

Antworten:

85

(Haftungsausschluss: Ich arbeite für Realm.Ich habe Realm jetzt verlassen, aber ich helfe immer noch gerne!) :) Vielen Dank! Es ist schön zu hören, dass du Realm genießt!

Mehrere Realm-Instanzen - Sie müssen sich darüber überhaupt keine Sorgen machen! Ein Realm-Dateiobjekt wird bei der ersten Instanziierung in jedem Thread erstellt, und dasselbe Objekt wird anschließend jedes Mal zurückgegeben, wenn Sie versuchen, es jedes Mal danach zu instanziieren.

Beibehalten von Realm-Instanzen - Nach dem ersten Punkt müssen Sie sich keine Sorgen mehr machen, dass Sie in anderen Objekten an der Realm-Referenz festhalten. Da Realm seine Realm-Dateiobjekte intern verfolgt und dieselben zurückgibt, werden Sie nicht dafür bestraft, dass Sie dies nicht tun. Wenn ein permanenter Verweis auf ein Realm-Objekt in Ihrem Objekt die Komplexität Ihres Codes vereinfacht, können Sie es weiterhin verwenden.

Zugreifen auf Realm-Beziehungseigenschaften - Genau genommen werden Daten aus Realm-Dateien nicht von der Festplatte kopiert (wie es ein normaler ORM tun würde). Darüber hinaus wird die Speicherzuordnung verwendet, um die Daten von der Festplatte direkt auf Ihre speicherinternen Eigenschaften zu verweisen. Nein, Sie müssen sich keine Sorgen machen, dass Realm-Dateien im Speicher zu groß werden.

Automatische Aktualisierung Die automatische Aktualisierung ist standardmäßig nur für das Realm-Dateiobjekt im Hauptthread aktiviert. Es muss manuell für Realm-Dateiobjekte in anderen Threads aktiviert werden, oder Sie können sie stattdessen manuell mit dem refreshMethodenaufruf aktualisieren.

EDIT: Ich stehe korrigiert! Alle Realm-Dateiobjekte in mehreren Threads sind autorefreshstandardmäßig aktiviert. Wenn diese autorefreshOption aktiviert refreshist, müssen Sie nur dann aufrufen, wenn die an einer Realm-Datei vorgenommenen Änderungen in den anderen Referenzen berücksichtigt werden müssen, bevor die aktuelle Iteration der Ausführungsschleife abgeschlossen ist.

Referenzieren der Realm-Referenz eines Objekts Absolut nicht, es ist überhaupt keine schlechte Praxis! Eigentlich bevorzuge ich dies in meinen eigenen persönlichen Apps, die Realm verwenden, um den richtigen Kontext bereitzustellen, da dies ausnahmslos einfacher ist und einen stärkeren visuellen Kontext zwischen dem Objekt und der übergeordneten Realm-Datei im Code bietet. (Haha yep, wenn es hier ein Threading-Problem gegeben hätte, hätten Sie es wahrscheinlich entdeckt, bevor Sie denwritePunkt erreicht hätten).


Ich hoffe das hat geholfen! Lassen Sie mich wissen, wenn Sie hier etwas klären müssen!

TiM
quelle
Fantastisch! Danke für die superschnelle Antwort. Wir werden sicher weitere Fragen stellen, sobald sie auftauchen! Der Punkt, dass die automatische Aktualisierung standardmäßig nur im Hauptthread aktiviert ist, sollte wahrscheinlich auch zur Dokumentation hinzugefügt werden. :)
Löwenhosen
4
Überhaupt nicht! Vielen Dank! Ahh, eigentlich stehe ich korrigiert. Ich bin gerade zurückgegangen und habe den Code überprüft, um dies zu bestätigen. Es sieht so aus, als ob die automatische Aktualisierung jetzt standardmäßig für alle Threads aktiviert ist. Ich habe meine Antwort aktualisiert, um dies widerzuspiegeln.
TiM
Ich bin wirklich gestresst von diesem Problem mit Speicherausnahmen und ich kann es anscheinend nicht
umgehen
Für iOS? Können Sie bitte ein Problem mit weiteren Informationen zum Realm GitHub-Repo erstellen? github.com/realm/realm-cocoa
TiM