【发布时间】:2019-05-30 06:49:57
【问题描述】:
我正在构建一个使用 firebase 进行身份验证和数据库功能的应用。用户注册后,系统会为该用户存储一条数据库记录,其中包含一些基本信息,例如名字、姓氏等。
一旦用户使用他的凭据登录,我想设置一个全局变量(可能是 userDefaults?),其中包含该特定用户的用户数据。否则,每次我想用例如用户的名字填充标签时,我都必须获取用户数据。
我设法在登录时设置 userdefaults 并在 UIlables 中使用此信息。但是当我让用户更改他们的数据时,其中一些对应用程序的运行很重要,我可以更新服务器和用户默认值,但应用程序本身不会使用正确的数据进行更新。它将旧数据保存在(例如)UIlables 中。
我很想更深入地了解管理此类情况的最佳工作流程。
打开应用程序时,我将tabBarController 设置为rootviewcontroller。在tabbarcontroller 的负载中,我有以下代码从firebase 检索用户数据并将其保存到userdefaults:
guard let uid = Auth.auth().currentUser?.uid else { return }
Database.database().reference().child("users").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
print(snapshot.value ?? "")
guard let dictionary = snapshot.value as? [String: Any] else { return }
let firstname = dictionary["First name"] as? String
let lastname = dictionary["Last name"] as? String
print("first name is: " + firstname!)
UserDefaults.standard.set(firstname, forKey: "userFirstName")
print(UserDefaults.standard.value(forKey: "userFirstName"))
self.setupViewControllers()
}
然后我继续加载 tabBarController 中的所有视图控制器:
self.setupViewControllers()
在此过程中,这些视图控制器中的标签会填充用户默认数据。
这是一个使用 userDefaults 填充但在更改 userdefaults 时不更新标签的示例:
let welcomeLabel: UILabel = {
let label = UILabel()
let attributedText = NSMutableAttributedString(string: "Welcome ")
attributedText.append(NSAttributedString(string: "\(UserDefaults.standard.string(forKey: "userFirstName")!)"))
label.attributedText = attributedText
label.font = UIFont.systemFont(ofSize: 30, weight: .bold)
return label
}()
这是我用来更新名字的函数(通过用户填写的文本字段):
@objc func updateName() {
guard let uid = Auth.auth().currentUser?.uid else { return }
Database.database().reference().child("users").child(uid).updateChildValues(["First name" : updateNameField.text ?? ""])
UserDefaults.standard.set(updateNameField.text, forKey: "userFirstName")
print(UserDefaults.standard.value(forKey: "userFirstName"))
}
【问题讨论】:
-
这看起来像是您需要使用通知实现 Observable 模式的情况,以便在保存新/更新的数据时,应用程序的其他部分会收到有关它的通知并可以自行更新。例如见this article
-
@CvEijk 您希望存储哪些信息。你能说得更具体些吗,我可以帮忙
-
一个更简单的选择是将使用视图控制器中的用户信息更新 UI 的所有代码收集到一个方法中,这样当您保存用户数据时,只需调用该方法即可。类似于
tableView.reloadData() -
@JoakimDanielson 他需要一些东西来刷新视图。这只是设置您提到的观察者并刷新通知视图。但他是否需要更多。如果是这种情况,将使用更好的缓存系统。顺便说一句,两者都很容易实现。我们需要了解他的要求
-
@AakashDave 这已经困扰我太久了哈哈,感谢您花时间和精力分享您的专业知识,非常感谢:)
标签: ios swift firebase userdefaults