2015-07-31 11 views
5

Ich versuche, eine Anwendung in OS X mit einer Realm-Datenbank zu schreiben. In meinem Programm muss ich warten, bis ein Realm-Schreibvorgang abgeschlossen ist, und dann einen neuen Veiwcontroller aufrufen. Nach vielen Nachforschungen scheint es angebracht zu sein, Realms eingebaute Benachrichtigungszentrale zu verwenden. Nach Angaben der Realm Dokumentation sollte das Format wie diese ArbeitSo verwenden Sie Realm-Benachrichtigungen

let token = realm.addNotificationBlock { notification, realm in 
    viewController.updateUI() 
} 

Ich verstehe, dass dies eine rasche Schließung ist, aber ich bin nicht sicher, wie es zu benutzen. Wenn ich den Code zu diesem

geändert
let token = realm.addNotificationBlock { notification, realm in 
    println("The realm is complete") 
} 

Wäre das auf meine Debug-Fenster drucken, wenn die Schreib abgeschlossen ist? Oder einfacher, wie führe ich einen Code nur aus, nachdem ich die Benachrichtigung erhalten habe?

Wenn ich den obigen Code in meiner Anwendung platziere ich nicht meine Linie in der Debug-Fenster sehen alles, was ich sehe, ist die folgende:

2015-07-31 16:08:17.138 Therapy Invoice[27979:2208171] RLMNotificationToken released without unregistering a notification. You must hold on to the RLMNotificationToken returned from addNotificationBlock and call removeNotification: when you no longer wish to receive RLMRealm notifications.

Antwort

6

Machen notificationToken eine Ivar:

var notificationToken: NotificationToken? 


deinit{ 
    //In latest Realm versions you just need to use this one-liner 
    notificationToken?.stop() 

    /* Previously, it was needed to do this way 
    let realm = Realm() 
    if let notificationToken = notificationToken{ 
     realm.removeNotification(notificationToken) 
    } 
    */ 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    let realm = Realm() 
    notificationToken = realm.addNotificationBlock { [unowned self] note, realm in 
     self.tableView.reloadData() 
    } 
... 
} 
+4

'realm.removeNotification' [veraltet] (https://github.com/realm/realm-cocoa/issues/317), verwenden Sie' notificationToken. stop() ' –

7

Aus Realm latest docs (3.0.1):

Fügen Sie notificationToken.invalidate() hinzu, um die Registrierung aus der Benachrichtigung zu entfernen.

Im Detail:

  • Deklarieren der notificationToken als Klassenvariable

    var notificationToken: NotificationToken? 
    
  • Stellen Sie die notificationToken in viewDidLoad()

    notificationToken = realm.observe { [unowned self] note, realm in 
        self.tableView.reloadData() 
    } 
    
  • Unregister aus der Mitteilung in viewWillDisappear(animated: Bool)

    notificationToken?.invalidate() 
    

bearbeiten Notizen:

  1. notificationToken.stop() veraltet.
  2. realm.addNotificationBlock... den folgenden Fehler verursachen:

    Value of type 'Realm' has no member 'addNotificationBlock'