2016-06-25 10 views
1

Woher weiß ich, wann eine bestimmte Transaktion abgeschlossen wurde?RealmSwift - Abschluss der Transaktion

Ich möchte einen bestimmten Codeblock ausführen, nachdem eine Transaktion abgeschlossen ist. Wie kann ich das machen?

I schreibt in dem folgenden Krieg bin Durchführung -

do { 

    try realm.write({ 
    realm.add(<some object>) 
    }) 
} 
catch {} 

Antwort

2

beste Ansatz, um die Methode als Erweiterung für Realm Objekt zu schreiben wäre.

Für Swift 3+

extension Realm { 

    /// Performs actions contained within the given block 
    /// inside a write transaction with completion block. 
    /// 
    /// - parameter block: write transaction block 
    /// - parameter completion: completion executed after transaction block 
    func write(transaction block: (Void) -> Void, completion: (Void) -> Void) throws { 
     try write(block) 
     completion() 
    } 
} 

Swift 2,0

extension Realm { 

    /** Performs actions contained within the given block inside a write transaction with 
    completion block. 

    - parameter block: write transaction block 
    - completion: completion executed after transaction block 
    */ 
    func write(@noescape transactionBlock block: Void ->(), completion: Void ->()) throws { 
     do { 
      try write(block) 
      completion() 
     } catch { 
      throw error 
     } 
    } 
} 

Jetzt können Sie die Erweiterung verwenden wie eine normale write(_:) Methode.

let realm = try! Realm() 
let object = SomeObject() 

try! realm.write(
     transactionBlock: { 
      realm.add(object) 
     }, 
     completion: { 
      print("Write transaction finished") 
    }) 
4

Transaktionen werden synchron ausgeführt. Sie können also den Code direkt nach dem Ausführen der Transaktion ausführen.

Ich würde "force-try" empfehlen, wie unten zu sehen, um im Falle eines Fehlers abzubrechen, wenn Sie keine Art von Fehlerbehandlung bieten. Transaktionen können nicht wiederhergestellt werden, wenn der Speicherplatz nicht ausreicht. In den meisten Fällen erwarten Sie, dass Ihre Daten nach einer Transaktion im Code ausgeführt werden, was im Falle eines Fehlers nicht zutrifft. Außerdem sehen Sie keine Fehler in der Entwicklung, wenn Sie den Fangpfad vollständig leer halten.

try! realm.write { 
    realm.add(<some object>) 
} 
runMoreCode() 
+1

Dies ist die richtige Antwort – Donamite

Verwandte Themen