当Realm对象服务器具有不同的IP时,我遇到了问题。应用程序可以通过Credential登录,但之后它将返回空数据,尽管我的数据库位于该IP上并且可以由Realm Browser访问。实际上,我只在领域对象服务器中使用一个帐户,并创建一个用户名和密码的用户表,以便在通过Credential连接到服务器后,我将在屏幕上读取用户名和密码,并在数据库中检查它的信息。
连接到Realm Object Server功能:
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的第一个应用程序,所以我在这种情况下没有多少经验。
答案 0 :(得分:1)
我可能需要有关您在登录后如何处理登录的Realm的更多信息,但是从您在此处显示的代码中,您似乎意外地访问了本地版本的领域而非同步领域。
登录后,您需要确保在此之后创建Configuration
实例时使用相同的Realm
对象。建议不要在登录完成块中创建并保存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
对象,否则它将默认返回使用正常的空本地域。