2016-12-28 64 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。