2016-07-21 4 views
1

Angenommen ich ein Suchtext Objekt als solche haben:Wie kann ich ein Realm-Objekt zurückgeben oder eins erstellen, wenn es leer ist?

class SearchText: Object { 
    dynamic var text: String = "" 
} 

Ich möchte einen Accessor erstellen, so dass ich das Objekt bekommen kann, wenn sie oder ein solches vorhanden ist zu erstellen, wenn es nicht der Fall ist. Das habe ich.

extension Realm { 
    var searchText: SearchText { 
     if let searchText = objects(SearchText.self).first { 
      return searchText 
     } else { 
      let searchText = SearchText() 
      try! write { 
       add(searchText) 
      } 
      return searchText 
     } 
} 

Das funktioniert irgendwie, aber hier ist mein Problem. Ich möchte Suchtext verwenden und auch seinen Wert aktualisieren. Etwas wie:

func updateSearchText(text: String) { 
     try! write { 
      searchText?.text = text 
     } 
    } 

Als ich updateSearchText versuchen, erhalte ich ein Reich Ausnahme von Realm is already in a write transaction. Ich denke, es liegt daran, dass ich in Schreibweisen niste: den Text erstellen und dann aktualisieren.

Wie würde ich das elegant machen?

Antwort

1

Realm stellt derzeit keine verschachtelte Transaktion bereit. Es gibt eine Möglichkeit, die Ausnahme zu vermeiden, indem Sie überprüfen, ob Sie sich in der Schreibtransaktion befinden, bevor Sie eine Transaktion öffnen. Wie folgt aus:

func updateSearchText(text: String) { 
    func update() { 
     searchText?.text = text 
    } 

    if inWriteTransaction { 
     update() 
    } else { 
     try! write { 
      update() 
     } 
    } 
} 

Vielleicht sollte auch search Setter sein:

var searchText: SearchText { 
    if let searchText = objects(SearchText.self).first { 
     return searchText 
    } else { 
     let searchText = SearchText() 
     if inWriteTransaction { 
      add(searchText) 
     } else { 
      try! write { 
       add(searchText) 
      } 
     } 
     return searchText 
    } 
}