2016-08-05 29 views
0

ich mit dem folgenden Code ein Lied zu einer Liste in meinem Playlist-Objekt am Zusatz:iOS - Element Anfügen in Bereich zur Liste bleibt nicht Element

func addSongsForPlaylist(songs: [Song], list: Playlist) { 
    try! realm!.write { 
     for song in songs { 
      list.RLMsongs.append(song) 
     } 
    } 
} 

Wo songs nur ein Array der Songs ist, dass ich möchte hinzufügen. Die Songs in songs sind nicht persistente Objekte (noch nicht im Bereich), aber list ist bereits in Realm gespeichert.

Ich habe einige Fragen hier auf Stackoverflow gefunden, die scheinen, die gleiche Frage zu stellen, aber alle ihre Lösungen hatten damit zu tun, den Anhang in eine Schreibtransaktion zu wickeln, die ich bereits mache, wie Sie sehen können.

Ich habe auch versucht, die folgenden:

try! realm!.write { 
    list.RLMsongs.appendContentsOf(songs) 
} 

Was geschieht, ist, dass, wenn ich po list.RLMsongs in der Konsole das neue Lied betreten gibt es und es sieht gut aus, aber wenn ich po list seine RLMsongs Eigenschaft eingeben fehlt das neue Lied. Wie können beide wahr sein? Es scheint sich selbst zu widersprechen und scheint etwas Grundlegendes zu sein, das mir an RealmSwift fehlt.

Es sieht so aus, als ob es die Liste im Speicher aktualisiert, aber nicht wirklich zu Realm verpflichtet. Daher dachte ich, dass vielleicht der Schreibblock nicht korrekt übergeben wurde und es in eine do catch eingepackt hat, aber der Catch wird nie ausgeführt, so dass die Schreibtransaktion erfolgreich übergeben werden sollte.

EDIT:

Auch bemerkte ich, dass ich in der Lage bin, die Schreibtransaktion zu entfernen, und es gefällt mir nicht einen Fehler geben. Ich denke, das könnte ein Hinweis darauf sein, was hier vor sich geht. Ist es möglich, dass die Liste als nicht persistent angesehen wird und daher nicht richtig in Realm aktualisiert wird, obwohl der Inhalt der Liste (die Lieder) persistente Objekte sind?

Antwort

0

Stellt sich heraus, dass mein Problem war, dass ich die Playlist aus Realm abrufen musste ... irgendwie wurde die Playlist, wie sie in die Funktion übergeben wurde, nicht als gültiges persistentes Objekt im Realm betrachtet. (Auch wenn ich andere Update-Funktionen habe, die auf die gleiche Weise funktionieren, anstatt andere Objekte an die Songliste anzuhängen und diese Update-Funktionen funktionieren)

Meine einzige Vermutung ist, dass etwas mit dem Anhängen einer Liste zu tun hat eines persistierten Objekts funktioniert irgendwie anders und die Liste muss explizit innerhalb des lokalen Bereichs abgerufen und nicht nur als Funktionsparameter übergeben werden. Da könnte ich mich jedoch irren. Ich weiß nur, dass ich damit mein Ziel erreicht habe.

0

Das liegt daran, po list zeigt den Inhalt der Instanzvariablen des Realm-Objekts, nicht den Inhalt des Realms. Realm dupliziert nicht den gesamten Inhalt der Datenbank in den Instanzvariablen der Objektinstanzen, da dies ziemlich verschwenderisch wäre.

Realm stellt ein LLDB-Plug-in (rlm_lldb.py) zur Verfügung, das den Debugger anweist, tatsächliche Realm-unterstützte Inhalte und nicht die nicht verwendeten Instanzvariablen anzuzeigen. Es funktioniert jedoch nur mit Objective-C-Stack-Frames aufgrund von Einschränkungen in der LLDB-Python-API für Swift-Unterstützung.

+0

Ehrfürchtig, das macht Sinn. Danke für die Antwort. Nun, warum taucht es überhaupt nicht im Reich auf? Ich benutze den Realm-Browser, um zu sehen, was in Realm ist und es verbindet den Song nicht mit der Playlist oder fügt den Song überhaupt zu Realm hinzu. –

+0

Wenn Sie ein Beispielprojekt teilen, das das demonstriert, werde ich Ihnen gerne weiterhelfen. – jpsim

+0

Ich bin nicht wirklich in der Lage, dies in einem anderen Projekt @ Jpsim zu replizieren, jedoch habe ich einige neue Informationen in Bezug auf die Schreib-Transaktion (letzten Absatz nach der Bearbeitung) gefunden. Hilft Ihnen dies dabei, das Problem zu beleuchten? –