因此,在我的应用中,我有一个视图控制器,允许用户在UITextField
中输入电子邮件和密码,然后我将用户登录到Firebase并识别与电子邮件关联的uid。我还有一个名为User
的结构,其中包含用户名和用户ID字符串以及一个字符串数组(我没有为它提供代码,因为我认为没有必要,但如果你需要它,请让我知道)。
我有一个班级变量
var currentUser:User? = nil
并在登录按钮的@IBaction
方法中,我使用前面提到的uid初始化具有FIRDataSnapshot
的用户:
FIRAuth.auth()?.signIn(withEmail: usernameTextBox.text!, password: passwordTextBox.text!) { (user, error) in
if error == nil {
//Valid Email and Password
let userID = FIRAuth.auth()?.currentUser?.uid
self.childRef.observe(.value, with: { snapshot in
for item in snapshot.children.allObjects as! [FIRDataSnapshot] {
let dict = item.value as! Dictionary<String,Any>
if (dict["UserID"] as? String == userID) {
self.currentUser = User(snapshot: item) //<----This is where currentUser is assigned the new User
}
//currentUser = User(snapshot: )
self.performSegue(withIdentifier: "LoginSegue", sender: sender)
}
})
}
else {
//Error stuff
}
}
我的问题是,在另一个类中,我需要访问currentUser变量(添加朋友等),但我不知道如何去做。我也无法从其他类的Firebase中提取用户数据,因为只有上述的用户数据才能访问我需要识别要使用和修改哪些用户信息的UserID。
我不能使用prepareForSegue
,因为在你登录的那个和其他视图控制器之间有一个SWRevealViewController,而SWRevealViewController是用Objective-C编写的,我不熟悉。我的研究表明,一些可能性可能是全局变量和单例,但使用其中任何一种都被许多程序员视为不安全的实践。另外使用NSUserDefaults
(我认为它们已经在Swift 3中重命名为UserDefaults
)是另一种可能的解决方案吗?我对任何建议持开放态度。
提前致谢。
答案 0 :(得分:1)
有多种方法可以跨多个类使用相同的用户数据或获取的数据。这取决于数据的大小和使用情况。
以下是实现此目的的一些简单方法:
即使重新启动应用后,您也可以使用UserDefaults
在多个类中保留数据,重启后数据会一直显示,直到您清除它为止。
您可以像Singleton
一样使用AppDelegate
课程,添加一些相关属性,例如Dictionary
或Array
,可以从任何一个类访问它。
推送ViewController
时,将数据从一个类传递到另一个类。
如果您不需要坚持,我认为使用Singleton
课程可以解决您的问题。您还可以在Singleton
类中编写常用方法,这样您就不必重复编写相同的方法,一遍又一遍地在多个类中使用。普通Static Strings
或Macros
也是如此。
希望它有所帮助。
答案 1 :(得分:1)
您可以在任何视图中执行此操作。如果让currentUser =
FIRAuth.auth()?.currentUser {
let email = currentUser.email //
get more user data
}