2015-08-26 5 views
11

Ich frage mich, was die beste Praxis für die Instanziierung einer Realm-Datenbank für Swift 2 ist. Einer der Hauptunterschiede zwischen Realm für Swift 1.2 und Swift 2 ist, dass die Realm-Klasse Unterstützung für die Fehlerbehandlung hinzugefügt hat. Daher ist dieser Code auf der Realm Webseite nicht mehr funktioniert:Instantiieren der Realm-Datenbank für Swift 2.0 - Best Practice?

let realm = Realm()

ich von ein paar Möglichkeiten denken kann, eine Realm-Klasse in der Swift 2 Welt zu instanziiert:

(1) lass realm = versuchen! Realm()

Diese Option scheint mir ein wenig "unsicher" zu sein, da es möglicherweise zu einem Laufzeitfehler führt, wenn die Klasse nicht instanziiert wird.

(2) Platz gesamten Realm Betrieb (einschließlich Klasse Instanziierung) innerhalb Do-Catch-Block

do { 
    let realm = try Realm() 

    realm.write{realm.add(myObject)} 
    } 
    catch 
    { 
     print("Some Realm error") 
    } 

Dies funktioniert auf jeden Fall und ist auf jeden Fall sicher. JEDOCH mag ich es nicht wirklich, die Realm-Klasse instanziieren jedes Mal, wenn ich eine Operation für die Datenbank ausführen muss. Wenn ich versuche, einen IVAR-Bereich zu erstellen und ihn außerhalb des Do-Catch-Blocks zu platzieren, wird die Variable nicht mehr verwendet. Zum Beispiel wird der folgende Code nicht kompilieren ...

//IVAR declared outside of Do-Catch... 
    let realm:Realm 

    do{ 
     //Get instance of Realm 
     realm = try Realm() 

     //This write operation works 
     realm.write{realm.add(myObject_1)} 
    } 
    catch 
    { 
     print("Some Realm error") 
    } 


    //Create another Dog object 
    let myObject_2 = SomeObject() 

    //This next line produces an error: "Variable 'realm' used before being initialized". 
    //Initialized 'realm' inside Do-Catch is now out of scope. 
    realm.write({ 
     realm.add(myObject_2) 
    }) 

ich jedes Feedback (vor allem jemanden von Realm) zu schätzen wissen würde, was die beste Praxis für mit Realms in dem neuen Fehler Arbeitsumgebung von Swift Handhabung 2 Sollte aussehen, wie. Danke im Voraus.

Antwort

7

Sofern Sie nicht die Fehler behandeln, die Sie erhalten, empfehle ich hoch mit try!.

Ihr zweites Code-Snippet funktioniert nicht, da die Variable realm niemals zugewiesen wird, wenn die Initialisierung des Realms fehlschlägt, was ungültig ist. Sie könnten wahrscheinlich daran arbeiten, indem Sie die realm Variable vom Typ Realm? machen.

+0

Vielen Dank – luckman777

+1

versuchen! macht den Trick, aber ich stimme mit @ luckman777 überein, es fühlt sich unsicher an und es könnte die App zum Absturz bringen. Wenn es abstürzt, könnte es sein, weil die Datei fehlt oder ein Migrationsfehler, der wahrscheinlich in einem sehr globalen Bereich vielleicht auf appLaunch behandelt werden sollte ... versuchen? Auf der anderen Seite kann ein optionaler Wert zurückgegeben und das Fehlerbehandlungsszenario unterdrückt werden. Ich bin mir nicht sicher, was besser ist, im Moment änderte ich die meisten Instanzen, um es zu versuchen! ... und hoffe auf das Beste? –

1

Denken Sie daran, dass sowohl Realm() und Write werfen können. Das bedeutet, dass beide versuchen müssen zu fangen, es sei denn Sie versuchen es! So:

do { 
     let realm = try Realm() 

     do { 
      try realm.write { 
       realm.add(myObject_1) 
      } 
     } catch let error { 
      print(error) 
     } 

    } catch let error{ 

     print(error) 
    }