2016-10-07 5 views
0

Swift 3, Xcode 8, RealmSwift 2.0.2, Realm Object Server 1.0Verschiedene Realm Konfigurationen erscheinend in Swift App

In meinem AppDelegate habe ich eine Funktion, die meine Realm-Konfiguration setzt zu einem Remote verbinden Sync-Server, den ich eingerichtet habe. Ich verwende nur einen Testaccount zur Authentifizierung, bis ich die Grundlagen der Synchronisierung erhalten kann. 1.1.1.1 ist nicht meine echte IP-Adresse. ;)

let username = "test" 
let password = "test" 

let address = "http://1.1.1.1:9080" 
let syncAddress = "realm://1.1.1.1:9080/~/myapp" 

SyncUser.authenticate(with: Credential.usernamePassword(username: username, password: password, actions: []), server: URL(string: address)!, onCompletion: { user, error in 
    guard let user = user else { 
     fatalError(String(describing: error)) 
    } 

    // Open Realm 
    Realm.Configuration.defaultConfiguration = Realm.Configuration(
     syncConfiguration: (user, URL(string: syncAddress)!) 
    ) 
}) 

Das scheint gut zu funktionieren. Ich sehe Daten auf meinem Server erscheinen, und ich bekomme keine Fehler. Meine Annahme ist, dass das Setzen der Realm-Konfiguration bedeutet, dass alle Instanzen von Realm() diese Konfiguration verwenden.

ich dann ein realm Objekt als Klasseneigenschaft in zwei separaten View-Controller:

class TableViewControllerA: UITableViewController{ 
    let realm = try! Realm() 
    override func viewDidLoad() { 
    // CORRECT: Prints "nil" as it should for a remotely synced Realm instance 
    print(realm.configuration.fileURL) 
    } 
} 

... und eine andere in einer anderen Datei:

class ViewControllerB: UIViewController{ 
    let realm = try! Realm() 
    override func viewDidLoad() { 
    // WRONG: Prints the path to the local realm file in the Simulator 
    print(realm.configuration.fileURL) 
    } 
} 

Wie in den Code-Kommentaren darauf hingewiesen, oben sind die beiden Instanzen von realm unterschiedlich. Auf einigen meiner View-Controller kann ich Objekte auf dem Server speichern und sie auf meinem Gerät anzeigen lassen. Auf anderen View-Controllern werden keine Daten angezeigt, da die falsche Realm-Datenbank verwendet wird.

Kann ich nicht zuverlässig erwarten, dass eine Realm-Konfiguration in meiner App bestehen bleibt? Muss ich etwas anderes tun, um dieselbe Konfiguration zu verwenden?

+0

Überprüfen Sie, ob der View-Controller vor der Festlegung der Standardkonfiguration instanziiert wird. – bdash

+0

Ich setze die Standardkonfiguration in meinem App Delegate. Kann ich nicht garantieren, dass das zuerst passiert? –

+0

Der von Ihnen gepostete Code zeigt, dass Sie die Standardkonfiguration in einem Rückruf festlegen, der asynchron aufgerufen wird, nachdem der Benutzer authentifiziert wurde. – bdash

Antwort

1

Sie legen die Standardkonfiguration im Authentifizierungsabschluss-Handler fest. Dieser Rückruf wird asynchron aufgerufen, nachdem der Benutzer authentifiziert wurde. Wenn eine Instanz einer Ihrer View-Controller-Unterklassen vor dem Ausführen des Callbacks erstellt wird, verwendet der Realm, der geöffnet wird, die Standardkonfiguration , bevor Sie Änderungen an Ihrem Authentifizierungsabschluss-Handler vornehmen.

+0

Wie würden Sie diese Situation am besten vermeiden? – Daniel

+1

Ich habe es vermieden, indem ich den Rest meiner UI mit einem Benutzerauthentifizierungsbildschirm blockierte. Sobald sich der Benutzer anmeldet, lade ich programmgesteuert ein anderes Storyboard ein. –

+0

Lustig - genau das, was ich getan habe - fragte sich, ob jemand einen Semaphor benutzt oder eine andere Technik benutzt hat, um auf den Abschluss des Fertigstellungshandlers zu warten. Vielen Dank! – Daniel

Verwandte Themen