Извините, мой предмет не очень конкретен.
Я имею дело с управлением несколькими пользователями в моей сфере и возникли некоторые проблемы.У меня есть регистрация пользователя с его адресом электронной почты и именем, затем, когда область входит в систему и создает SyncUser
, я создаю новый объект YpbUser
с адресом электронной почты, именем и SyncUser.current.identity
в YpbUser.id
.
Когда пользователь входит в систему, я хочу использовать его электронную почту, чтобы посмотреть, существует ли существующий YpbUser
для его электронной почты.Я делаю это таким образом, чтобы в будущем, если кто-то использует имя пользователя / пароль и затем использует аутентификацию Google (еще не реализовано), эти SyncUser
s могут получить тот же YpbUser
.
Ниже приведен мой код для проверки существующего YpbUser
, а также мой код установки области.У меня проблема в том, что обычно, но не всегда, не удается найти YpbUser
, даже если этот пользователь существует (я смотрю на список YpbUser
в realm studio, и пользователь с таким электронным письмом определенно присутствует!)
Проверка изнутри existingUser(for:in:)
, users
обычно равна 0, но иногда ненулевой.
Я предполагаю, что проблема заключается в том, что я в значительной степенипросто гадать, как использовать SyncSubscription.observe
.
Пожалуйста, помогите?
fileprivate func openRealmWithUser(user: SyncUser) {
DispatchQueue.main.async { [weak self] in
let config = user.configuration(realmURL: RealmConstants.realmURL, fullSynchronization: false, enableSSLValidation: true, urlPrefix: nil)
self?.realm = try! Realm(configuration: config)
let songSub = self?.realm?.objects(Song.self).subscribe()
let usersSub = self?.realm?.objects(YpbUser.self).subscribe()
self?.usersToken = usersSub?.observe(\.state, options: .initial) { state in
if !(self?.proposedUser.email.isEmpty)! {
self?.findYpbUser(in: (self?.realm)!)
}
}
self?.performSegue(withIdentifier: Storyboard.LoginToNewRequestSegue, sender: nil)
}
}
fileprivate func findYpbUser(in realm: Realm) {
if proposedUser != YpbUser() { // self.proposedUser.email gets set from the login method
let existingUser = YpbUser.existingUser(for: proposedUser, in: realm)
guard existingUser == nil else { // If we find the YpbUser, set as current:
try! realm.write {
pr("YpbUser found: \(existingUser!)")
YpbUser.current = existingUser }
return
}
pr("YpbUser not found.") // i.e., SyncUser set, but no YpbUser found. i.e., creating a new YpbUser
createNewYpbUser(for: proposedUser, in: realm)
}
}
extension YpbUser {
class func existingUser (for proposedUser: YpbUser, in realm: Realm) -> YpbUser? {
let users = realm.objects(YpbUser.self)
let usersWithThisEmail = users.filter("email = %@", proposedUser.email)
if let emailUser = usersWithThisEmail.first {
return emailUser
}
return nil
}
}