我目前正在学习如何使用SwiftUI使用Firebase和Firestore数据库。 我想知道什么是组织和管理用户数据的最佳方法。
我已经进行了一些研究,但我仍然很困惑。
在我的测试项目中,我成功实现了Firebase Phone Auth,但是我的数据管理一团糟。我在“电话输入”视图上的“按钮”操作中调用了Firebase,然后重定向到“验证”视图,在该视图中,我还检查用户是否在按钮操作中也给了我良好的验证码。
我听说过Model,View,ViewController模型,我正在尝试实现它。 那意味着,我需要拥有一个包含所有用户属性的用户结构,才能在整个应用程序中读取它们?
我想知道在哪里可以找到有关如何在我的swift应用程序中管理和存储用户数据的良好文档。我真的很困惑,我正在四面八方,我需要集中精力。
答案 0 :(得分:0)
如果要存储非常基本的用户数据,例如其名称和电子邮件,则可以使用FIRUser的内置功能。可以使用Swift这样添加displayName和emailAddress:
let changeRequest = Auth.auth().currentUser?.createProfileChangeRequest()
changeRequest?.displayName = displayName
changeRequest?.commitChanges { (error) in
// ...
}
和电子邮件:
Auth.auth().currentUser?.updateEmail(to: email) { (error) in
// ...
}
但是,如果要存储特定于应用程序功能的自定义用户数据,我建议使用Firestore(Firebase提供的数据库平台)。
使用本教程使用Firestore设置您的应用程序:
https://firebase.google.com/docs/firestore/quickstart
设置了Firestore后,您要为用户创建一个集合,每个用户都将拥有一个包含其数据的文档,可以使用其UID来获取该文档。
创建用户时,您还希望在Firestore数据库的用户集合中创建一个文档,并且当您要访问用户数据时,您想要回读此数据。
为此,遵循ObservableObject的类效果很好。
确保导入FirebaseFirestore和FirebaseAuth。
首先创建一个自定义结构来保存我们用户的值。这些都是完全可定制的,我仅列举一些示例。这些功能可能非常复杂,并且专门针对您的应用功能。
struct CustomUser {
var name: String
var favouriteColor: String
var dateCreated: Date
var age: Int
}
创建这样的课程
class UserFetch: ObservableObject {
// ...
}
然后,我们需要一个保留用户的变量。为确保已更新,我们使用@Published
属性包装器。我们还要添加一个变量,为我们的用户保存Firestore集合。
class UserFetch: ObservableObject {
@Published var user: CustomUser?
var collection: CollectionReference = Firestore.firestore().collection("users")
// ...
}
现在,我们要编写一个将数据写入文档的函数:
class UserFetch: ObservableObject {
@Published var user: CustomUser?
var collection: CollectionReference = Firestore.firestore().collection("users")
func createUser(withName: String, favouriteColor: String, dateCreated: Date, age: Int, forUserID: String) {
self.collection.document(forUserID).setData(["name": withName,
"favouriteColor": favouriteColor,
"dateCreated": dateCreated,
"age": age]) { (error) in
if error != nil {
print((error?.localizedDescription)!)
return
} else { print("CREATED DATA - USER: \(forUserID)") }
}
}
// ...
}
创建用户时,请调用此函数。
现在我们需要从Firestore中读取用户
class UserFetch: ObservableObject {
@Published var user: CustomUser?
var collection: CollectionReference = Firestore.firestore().collection("users")
func createUser(withName: String, favouriteColor: String, dateCreated: Date, age: Int, forUserID: String) {
self.collection.document(forUserID).setData(["name": withName,
"favouriteColor": favouriteColor,
"dateCreated": dateCreated,
"age": age]) { (error) in
if error != nil {
print((error?.localizedDescription)!)
return
} else { print("CREATED DATA - USER: \(forUserID)") }
}
}
func fetch(uid: String) {
self.collection.document("\(uid)").addSnapshotListener { (snapshot, error) in
if error != nil {
print((error?.localizedDescription)!)
return
} else {
print("READ USER DATA")
}
self.user = CustomUser(name: snapshot?.get("name") as? String ?? "", favouriteColor: snapshot?.get("favouriteColor") as? String ?? "", dateCreated: (snapshot?.get("dateCreated") as! Timestamp).dateValue(), age: snapshot?.get("age") as? Int ?? 0)
}
}
}
最后,添加一个读取此数据的初始化程序。
class UserFetch: ObservableObject {
init(uid: String) {
fetch(uid: uid)
}
@Published var user: CustomUser?
var collection: CollectionReference = Firestore.firestore().collection("users")
func createUser(withName: String, favouriteColor: String, dateCreated: Date, age: Int, forUserID: String) {
self.collection.document(forUserID).setData(["name": withName,
"favouriteColor": favouriteColor,
"dateCreated": dateCreated,
"age": age]) { (error) in
if error != nil {
print((error?.localizedDescription)!)
return
} else { print("CREATED DATA - USER: \(forUserID)") }
}
}
func fetch(uid: String) {
self.collection.document("\(uid)").addSnapshotListener { (snapshot, error) in
if error != nil {
print((error?.localizedDescription)!)
return
} else {
print("READ USER DATA")
}
self.user = CustomUser(name: snapshot?.get("name") as? String ?? "", favouriteColor: snapshot?.get("favouriteColor") as? String ?? "", dateCreated: (snapshot?.get("dateCreated") as! Timestamp).dateValue(), age: snapshot?.get("age") as? Int ?? 0)
}
}
}