Изменение IP-адреса в Realm Object Server
У меня проблема, когда у Realm Object Server другой 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, поэтому у меня нет особого опыта в этой ситуации.
1 ответ
Мне может понадобиться больше информации о том, как вы обрабатываете зарегистрированную область после входа в систему, но из кода, который вы там показали, похоже, что вы случайно получаете доступ к локальной версии области, а не к синхронизированной.
После входа в систему необходимо убедиться, что вы используете тот же 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
объект с успешно вошедшим в систему пользователем, в противном случае он по умолчанию вернется к использованию обычной пустой пустой области.