所以在我的应用程序中,我有一个视图控制器,允许用户在 UITextField
中输入电子邮件和密码,然后我将用户登录到Firebase并识别他们与电子邮件关联的uid . 我还有一个名为 User
的结构,其中包含用户名和用户ID字符串以及一个字符串数组(我认为这是必要的,但是如果你需要它,请告诉我) .
我有一个 class 变量
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
)是另一个潜在的解决方案吗?我对任何建议持开放态度 .
提前致谢 .
2 回答
您可以在任何视图中执行此操作 . 如果让currentUser =
有多种方法可以在多个类中使用相同的用户数据或获取的数据 . 这取决于数据的大小和使用情况 .
以下是一些实现此目的的简单方法:
即使在重新启动应用程序后,您也可以使用
UserDefaults
在多个类中保留数据,重新启动后数据将一直存在,直到您清除它为止 .您可以像
AppDelegate
一样使用Singleton
类,添加一些相关的属性,例如Dictionary
或Array
并从任何一个类访问它 .按
ViewController
时,将数据从一个类传递到另一个类 .我认为如果你不需要坚持它,使用
Singleton
类就足以解决你的问题了 . 您还可以在Singleton
类中编写常用方法,这样您就不需要重复编写相同的方法来反复使用多个类 . 常见的Static Strings
或Macros
也是如此 .希望能帮助到你 .