2016-04-12 5 views
0

Ich fange an zu lernen, wie Realm in meinem Projekt zu verwenden, es ist großartig, aber ich sehe ein Nachteil, ist das Threading-Problem, Realms Objekt ist nicht Thread sicher und kann nicht auf mehrere Threads gleichzeitig zugreifen Wenn ich also einige Daten von Alamofire abrufe, mappe ich sie auf Object, speichere sie, bringe sie dann zurück zu VC, um einige Änderungen zu berechnen, dann aktualisiere ich die UI, möchte den ganzen Teil vor der Aktualisierung der UI versenden, aber dann Realm direkt benutzend muss ich die Klasse Object abfragen.Mit Realm-Objekt direkt arbeiten oder Objektklasse zuordnen?

Also möchte ich fragen, ob es besser ist, Realm weiter zu bearbeiten und direkt damit zu arbeiten, oder es einer unveränderbaren Klasse oder Struktur zuzuordnen und alle Realm-Dienste in verschiedenen Threads zu verwenden?

Antwort

2

Es ist richtig, dass Realm-Objekte nicht threadsicher sind und nicht über Threads übergeben werden können, aber es ist trotzdem recht einfach, mit Realm in einer Multithread-Umgebung zu arbeiten, sobald Sie den Dreh raus haben. :)

Wenn Sie einige Änderungen an einer Realm Instanz in einem Hintergrundthread vornehmen, wird die äquivalente Realm Instanz im Hauptthread automatisch mit diesen Änderungen bei der nächsten Iteration der Ausführungsschleife aktualisiert. Wenn Sie Results Listen im Hauptthread haben (dh zum Anzeigen von Realm-Objekten in einer UITableView), werden diese Objekte auch automatisch mit den neuen Objekten/Änderungen aktualisiert, und Sie müssen lediglich sicherstellen, dass Ihre Benutzeroberfläche aktualisiert wird um diese Änderungen zu berücksichtigen. (NB: Für Realm Instanzen in anderen Threads, aber nicht der Haupt-Thread, müssen Sie Realm.refresh() nennen explizit in diesen Änderungen zu ziehen.)

Wenn Sie mit einem expliziten Realm Modell Object und wollen arbeiten, es passieren zu einem anderen Thread, um dort weiter zu arbeiten, ist die einfachste Sache zu tun, es zu einer Realm Instanz auf dem aktuellen Thread zu speichern, und dann wieder von der gleichwertigen Realm Instanz auf dem neuen Thread abzurufen. In diesem Fall wird empfohlen, dass Ihr Object-Schema eine primary key property enthält, da Sie diesen Wert über Threads übergeben können, und rufen Sie dann das gleiche Objekt erneut ab, indem Sie Realm.objectForPrimaryKey() für den neuen Thread aufrufen.

Für weitere Informationen empfehle ich die Threading section auf Realms Dokumentationsseite. Wir arbeiten derzeit auch an einer Möglichkeit, die Benachrichtigung bei der Änderung von Realm-Objekten im Hintergrund zu vereinfachen, damit UI-Updates automatisch ausgelöst werden.

(Disclaimer: Ich für Realm arbeiten)

+1

Um gerade diese Antwort zu aktualisieren, wie von Realm 2.2 (iOS, macOS, etc) Sie jetzt 'ThreadSafeReference' verwenden können, anstatt über den Primärschlüssel übergeben: https : //realm.io/news/obj-c-swift-2-2-thread-safe-reference-sort-properties-relationships/ Ich würde immer noch fragen, ob es Wert gibt Realm-Objekte auf Swift Objects zu mappen, wenn sie sicher gehandhabt werden Ist es eine totale Zeitverschwendung und sollte nie in Betracht gezogen werden? –

Verwandte Themen