【发布时间】:2019-10-18 15:46:24
【问题描述】:
我正在尝试从我的用户模型中设置“当前”,以便以后可以使用 current.username 或 current.uid 等,但是我得到“无法转换类型 'AuthDataResult 的值?'到预期的参数类型“用户””错误。在过去的项目中,我能够按照最底部显示的教程来做到这一点。我现在拥有的代码显示在它上面。我已经检查了与堆栈溢出相关的其他问题,但找不到对我有帮助的东西。
(用户模型)
import Foundation
import UIKit
import FirebaseDatabase.FIRDataSnapshot
class User: Codable {
let uid: String
let username: String
init(uid: String, username: String){
self.uid = uid
self.username = username
}
init?(snapshot: DataSnapshot) {
guard let dict = snapshot.value as? [String : Any],
let username = dict[Constants.Dict.username] as? String
else { return nil }
self.uid = snapshot.key
self.username = username
}
private static var _current: User?
static var current: User {
guard let currentUser = _current else {
fatalError("Error: current user doesn't exist")
}
return currentUser
}
class func setCurrent(_ user: User, writeToUserDefaults: Bool = false) {
if writeToUserDefaults {
if let data = try? JSONEncoder().encode(user) {
UserDefaults.standard.set(data, forKey: Constants.UserDefaults.currentUser)
}
}
_current = user
}
}
(当前项目 - LoginVC)
@objc func handleSignIn() {
guard let email = emailField.text else { return }
guard let pass = passwordField.text else { return
Auth.auth().signIn(withEmail: email, password: pass) { user, error in
if error == nil && user != nil {
--> --> ERROR HERE "user" !!
User.setCurrent(user, writeToUserDefaults: true)
self.dismiss(animated: false, completion: nil)
} else {
print("Error logging in: \(error!.localizedDescription)")
}
}
}
(更新的解决方案)
Auth.auth().signIn(withEmail: email, password: pass) { user, error in
if user?.user != nil {
let user = user!.user
UserService.show(forUID: user.uid) { (user) in
User.setCurrent(user!, writeToUserDefaults: true)
self.dismiss(animated: false, completion: nil)
}
...
【问题讨论】:
-
你能详细说明你为什么要这样做吗?如果您想获取已登录 Firebase 的 currentUser,则此
let user = Auth.auth().currentUser如果您想更改用户,则您要更改的用户无论如何都需要进行身份验证,因此您需要调用Auth.auth().signIn函数。请注意,Firebase 有一个与您的“用户”类不同的“用户”类。如果您想拥有自己的,请将其命名为“MyUser”。 -
如果我有当前用户,我可以检索其他内容,例如 current.time 或 current.score。我正在尝试像以前的项目一样制作电流,以便轻松地从 firebase 检索有关用户的信息。
-
我有一个解决方案,但在发布之前还有几个问题;没有说明,但您是否尝试使用单例模式来处理用户信息?我问这个是因为 UserService 看起来像你。此外,您的评论因此很容易从 firebase 中检索有关用户的信息,但您的问题中没有代码可以从 Firebase 中检索任何内容,而不是进行身份验证。如果您能详细说明一下,可能会有一个简单的解决方案。
-
是的。它是单例模式。我的 UserService 中有用于检索数据的代码。我在上面添加了我的整个用户模型。
-
我研究这段代码已经有一段时间了,如果您只想在整个应用程序中使用单例来访问用户信息,这似乎过于复杂。还不清楚调用
current时会发生什么 - 它返回 User 但出于什么目的?换句话说,如果您想要当前的用户名或 uid,使用let name = User.shared.name或let uid = User.shared.uid会不会更简单?
标签: swift firebase authentication login firebase-authentication