2017-01-23 5 views
2

Ich benutze Swift3 und Realm 2.3.Realm Swift Callback-Funktion

Und ich brauche Rückruf nach Abschluss der Transaktion.

zum Beispiel habe ich einen Code wie folgt, wie kann ich zurückrufen, nachdem eine Realm-Datentransaktion abgeschlossen ist?

DispatchQueue.main.async { 

    try! self.realm.write { 
      self.realm.add(friendInfo, update: true) 
    } 

} 

Antwort

2

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

DispatchQueue.main.async { 
    try! self.realm.write { 
     self.realm.add(friendInfo, update: true) 
    } 

    callbackFunction() 
} 
1

Es hängt davon ab, warum Sie den Rückruf benötigen, aber es gibt Realm eine Vielzahl von Möglichkeiten, um eine Benachrichtigung bereitstellen kann, wenn Daten geändert wird.

Der häufigste Anwendungsfall ist, wenn Sie eine Objektliste von einem Objekt Results anzeigen. In diesem Fall können Sie Realm's change notifications Funktion zu aktualisieren, bestimmte Objekte verwenden:

let realm = try! Realm() 
let results = realm.objects(Person.self).filter("age > 5") 

// Observe Results Notifications 
notificationToken = results.addNotificationBlock { [weak self] (changes: RealmCollectionChange) in 
    guard let tableView = self?.tableView else { return } 
    switch changes { 
    case .initial: 
    // Results are now populated and can be accessed without blocking the UI 
    tableView.reloadData() 
    break 
    case .update(_, let deletions, let insertions, let modifications): 
    // Query results have changed, so apply them to the UITableView 
    tableView.beginUpdates() 
    tableView.insertRows(at: insertions.map({ IndexPath(row: $0, section: 0) }), 
         with: .automatic) 
    tableView.deleteRows(at: deletions.map({ IndexPath(row: $0, section: 0)}), 
         with: .automatic) 
    tableView.reloadRows(at: modifications.map({ IndexPath(row: $0, section: 0) }), 
         with: .automatic) 
    tableView.endUpdates() 
    break 
    case .error(let error): 
    // An error occurred while opening the Realm file on the background worker thread 
    fatalError("\(error)") 
    break 
    } 
} 

Realm Objekteigenschaften sind auch KVO-compliant, so dass Sie auch die traditionelle Apple-addObserver API, wenn Änderungen eine bestimmte Eigenschaft verfolgen können.

Wenn all das passiert, wenn Sie einen sehr spezifischen Anwendungsfall haben, um benachrichtigt zu werden, wenn sich ein Teil von Realm-Daten ändert, können Sie auch eigene Benachrichtigungen mit etwas wie NotificationCenter implementieren.

Bitte folgen Sie, wenn Sie weitere Erläuterungen benötigen.