Возникли проблемы с областями на основе запросов - PullRequest
0 голосов
/ 09 июня 2018

Извините, мой предмет не очень конкретен.

Я имею дело с управлением несколькими пользователями в моей сфере и возникли некоторые проблемы.У меня есть регистрация пользователя с его адресом электронной почты и именем, затем, когда область входит в систему и создает 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...