2016-12-28 124 views
0

當Realm對象服務器具有不同的IP時,我遇到問題。應用程序可以通過Credential登錄,但在此之後它將返回空數據,儘管我的數據庫正好位於該IP上並且可以被Realm Browser訪問。實際上,我只在realm對象服務器中使用一個帳戶,並使用用戶名和密碼創建用戶表,以便在通過Credential連接到服務器之後,我將在屏幕上讀取用戶名和密碼並在數據庫中檢查它的信息。更改Realm對象服務器中的IP地址

連接到域對象服務器功能:

class func login(username: String, password: String, action: AuthenticationActions, completionHandler: @escaping()->()) { 
    let serverURL = NSURL(string: realmIP)! 
    let credential = Credential.usernamePassword(username: username, password: password, actions: [action]) 
    SyncUser.authenticate(with: credential, server: serverURL as URL) { user, error in 
     if let user = user { 
      syncUser = user 
      let syncServerURL = URL(string: realmURL)! 
      let config = Realm.Configuration(syncConfiguration: (user, syncServerURL)) 
      realm = try! Realm(configuration: config) 
     } else if error != nil { 

     } 
     completionHandler() 
    } 
} 

從表中查詢登錄後SyncUser:

class func loginLocal(employee: String) -> Bool{ 
    let predicate = NSPredicate(format: "employee = %@", employee) 
    if (realm != nil) { 
     let user = realm?.objects(MyUser.self).filter(predicate) 
     if ((user?.count)! > 0) { 
      return true 
     } 
    } 
    return false 
} 

的解決方案似乎是不可思議,好讓我通過調用一個函數多次按我的登錄按鈕,並希望它會通過服務器。

這是我第一次使用Realm和Realm Object Server的應用程序,所以我在這種情況下沒有太多經驗。

回答

1

我可能需要更多關於登錄後如何處理已登錄的Realm的信息,但是從您在此處顯示的代碼中看,您似乎意外地訪問了本地版本的Realm,而不是同步的一個。

一旦登錄,您需要確保在此後創建Realm實例時使用相同的Configuration對象。不建議在登錄完成塊內創建並保存realm實例,因爲此塊出現在後臺線程上,使其在其他任何地方都不可用。

如果你的程序是永遠在線,它更容易簡單地設置同步配置爲您的應用程序的默認領域:

SyncUser.authenticate(with: credential, server: serverURL as URL) { user, error in 
    if let user = user { 
     syncUser = user 
     let syncServerURL = URL(string: realmURL)! 
     let config = Realm.Configuration(syncConfiguration: (user, syncServerURL)) 
     Realm.Configuration.defaultConfiguration = config 
    } 
    completionHandler() 
} 

否則,您可以保存Configuration在某種全局對象,或每次需要創建Realm實例時都會重新創建它。要記住的重要一點是,您需要確保您的Realm實例正在使用Configuration對象與成功登錄的用戶,否則它將默認回到使用正常的空本地Realm。