首页 > 解决方案 > 在 Mongo RealmSwift 中注册用户之前如何调用系统函数?

问题描述

显然,调用 Realm 系统函数的要求之一是首先用户登录。我需要用户确认他们的外部设备 ID 以确保它存在并且可用。如果是,则继续进行 emailPasswordAuth 和用户注册。

我一直在触发下面的 if/elseif 错误处理程序,CheckDeviceAvailability但不知何故return被忽略了,无论如何用户都已注册。我究竟做错了什么?

我尝试过使用app.currentUser?.functions...,我也尝试过将函数嵌套在app.login块中,但仍然有问题。我不太了解async功能,所以我想它与此有关。

func signUp(EMAIL: String, PASSWORD: String, CONFIRM: String, DEVICEID: String) {
        if EMAIL == "" || PASSWORD == "" || CONFIRM == "" || DEVICEID == "" {
            self.errorMSG = "Fields must be filled"
            return
        }
        
        if PASSWORD != CONFIRM {
            self.errorMSG = "Passwords must match"
            return
        }
        
        app.currentUser!.functions.CheckDeviceAvailability([AnyBSON(DEVICEID)]) { result, error in
            self.statusMSG = result?.stringValue
            if error != nil {
                self.errorMSG = "Failed to call function: \(error!.localizedDescription)"
                _ = app.currentUser?.logOut()
                return
                
            } else if result!.stringValue != "available" {
                self.errorMSG = "That device is already taken, try again"
                _ = app.currentUser?.logOut()
                return
                
            } else {
                
                app.emailPasswordAuth.registerUser(email: EMAIL, password: PASSWORD) { ERROR in
                    guard ERROR == nil else {
                        self.errorMSG = "Failed to register user: \(ERROR!.localizedDescription)"
                        return
                    }
                    
                    app.login(credentials: .emailPassword(email: EMAIL, password: PASSWORD)) { (RESULT) in
                        DispatchQueue.main.async {
                            switch RESULT {
                            case .failure:
                                return
                            case .success(let USER):
                                        
                                let config = USER.configuration(partitionValue: "U-\(USER.id)")
                                Realm.asyncOpen(configuration: config) { (RES) in
                                    switch RES {
                                    case .failure(let ERR):
                                        self.errorMSG = "Failed to open realm: \(ERR)"
                                        return
                                    case .success(let REALM):
                                        self.statusMSG = "Open user realm success"
                                        let newUser = User()
                                        newUser._id = USER.id
                                        newUser.auraID = "U-\(USER.id)"
                                        newUser.Preferences = User_Preferences()
                                        newUser.Preferences?.email = EMAIL
                                        newUser.Preferences?.displayName = ""
                                        newUser.Preferences?.deviceID = DEVICEID
                                        newUser.Preferences?.signupDate = Date()
                                        
                                        try! REALM.write {
                                            REALM.create(User.self, value: newUser, update: .modified)
                                        }
                                        self.openUserRealm()
                                    }
                                    
                                }
                            
                                
                            }
                        }
                    }
                }
            }
        
        }

标签: swiftmongodbrealm

解决方案


推荐阅读