0

当领域对象服务器具有不同的 IP 时,我遇到了问题。该应用程序可以通过 Credential 登录,但之后它将返回空数据,尽管我的数据库位于该 IP 上并且可以通过 Realm Browser 访问。实际上,我只在领域对象服务器中使用一个帐户,并创建了一个包含用户名和密码的用户表,以便在它可以通过凭据连接到服务器后,我将读取屏幕上的用户名和密码并在数据库中检查它的信息。

连接 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 的应用程序,所以我在这种情况下没有太多经验。

4

1 回答 1

1

我可能需要有关您在登录后如何处理已登录领域的更多信息,但从您在那里显示的代码来看,您似乎不小心访问了领域的本地版本,而不是同步的领域。

登录后,您需要确保在之后Configuration创建Realm实例时使用相同的对象。不建议在登录完成块中创建然后保存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具有成功登录用户的对象,否则它将默认返回使用普通的空本地 Realm。

于 2017-01-10T03:33:25.220 回答