2017-03-29 3 views
2

Hallo alle im Versuch, einen iOS-App zu erstellen, die Daten unter Verwendung von Realm Object Server synchronisiert werden, aber es ist im etwas fehlenRealm Sync swift Beispiel

i corretly Realm-Objekt-Server auf meinem Server (remote) installierte ich kann zugreifen das Armaturenbrett richtig

i mit syncuser

anmelden können, aber ich habe Probleme die Datensynchronisation .. wenn ich die App öffnen anmelden i den Benutzer aber danach (im nicht in der Lage anyting zu synchronisieren)

Ich suchte online nach einem vollständigen Beispiel, aber ohne Erfolg kann jemand vorschlagen, ein einfaches und einfaches Beispiel für die Verwendung Realm-Sync mit swift?

Dank

+0

Können Sie weitere Details angeben? Kannst du deinen Code mit Realm und Login anzeigen? Kannst du auch das Log des Realm Objekt Servers anzeigen? –

Antwort

1

Das ist meine eigentliche Implementierung für eine Chat-Anwendung ist RealmSwift verwenden. Ich benutzen ein Modellobjekt namens Nachricht unten definiert:

class Message: Object { 
    dynamic var userId = "" 
    dynamic var name = "" 
    dynamic var text = "" 
    dynamic var dateCreated = NSDate() 
} 

Next ich einen Controller für das Senden und Sync-Nachrichten erstellt wurde:

// Instance variables 
var messages: Results<Message>! 
var token: NotificationToken! 
var configuration: Realm.Configuration! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Your viewDidLoad implementation 

    self.setupRealm() 

} 

Weiter, um das Setup-Verfahren für Realm. Wie in Real Documentation erwähnt, müssen Sie, wenn ein Realm über Nur-Lese-Berechtigungen verfügt, die API asyncOpen verwenden, wie unter Asynchron öffnende Realms beschrieben. Das Öffnen eines read-only Realms ohne asyncOpen führt zu einem Fehler.

private func setupRealm() { 

    let serverURL = URL(string: "http://your.server.ip:9080")! 
    let credentials = SyncCredentials.usernamePassword(username: "[email protected]", password: "password") 

    SyncUser.logIn(with: credentials, server: serverURL) { user, error in 
     if let user = user { 
      let syncURL = URL(string: "realm://your.server.ip:9080/~/Message")! 
      let syncConfig = SyncConfiguration(user: user, realmURL: syncURL) 
      self.configuration = Realm.Configuration(syncConfiguration: syncConfig) 
      self.setupDataSource() 

     } else if let error = error { 
      // handle error 
      debugPrint("error: \(error.localizedDescription)") 
     } 
    } 

} 

private func setupDataSource() { 

    Realm.asyncOpen(configuration: self.configuration) { realm, error in 
     if let realm = realm { 
      // Realm successfully opened, with all remote data available 
      self.messages = realm.objects(Message.self).sorted(byKeyPath: "dateCreated", ascending: true) 
      self.token = self.messages.addNotificationBlock({ (changes: RealmCollectionChange) in 
       debugPrint("Message update event") 
       self.collectionView.reloadData() 
      }) 

     } else if let error = error { 
      // Handle error that occurred while opening or downloading the contents of the Realm 
      debugPrint("error: \(error.localizedDescription)") 
     } 
    } 

} 

deinit { 
    self.token?.stop() 
} 

Schließlich wird die sendMessage() Methode, die ich verwenden, um die Nachricht zu senden:

func sendMessage(id: String, name: String, text: String) { 

    let message = Message() 
    message.userId = id 
    message.name = name 
    message.text = text 
    message.dateCreated = NSDate() 

    Realm.asyncOpen(configuration: self.configuration) { realm, error in 
     if let realm = realm { 
      // Realm successfully opened, with all remote data available 
      try! realm.write() { 
       realm.add(message) 
      } 
     } else if let error = error { 
      // Handle error that occurred while opening or downloading the contents of the Realm 
      debugPrint("error: \(error.localizedDescription)") 
     } 
    } 

} 

Hoffe, es hilft! Tschüss!