【问题标题】:How to save data from firebase asynchronous request in a global variable?如何将来自firebase异步请求的数据保存在全局变量中?
【发布时间】:2019-05-06 18:35:26
【问题描述】:

我知道在堆栈溢出时已多次询问此问题,但我似乎无法找到我正在寻找的答案。我正在尝试将来自 firebase 数据库的数据(使用 observeSingleEvent(snapshot))方法存储在全局变量中。详情见以下代码。

我已尝试添加完成处理程序并在线执行步骤,但这样做,observeSingleEvent 请求停止工作。

我之前的:

class ItemsTableViewController: UITableViewController {

    let listToUsers = "ListToUsers"

    var user: User!
    let ref = Database.database().reference()

    override func viewDidLoad() {
        super.viewDidLoad()
        let defaultUser = User()
        ref.child("users").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
            let value = snapshot.value as? NSDictionary
            defaultUser.uid = uid
            defaultUser.email = value?["email"] as? String ?? ""
            defaultUser.name = value?["name"] as? String ?? ""
            defaultUser.grad = value?["grad"] as? Int ?? 0
            defaultUser.number = value?["number"] as? String ?? ""
            defaultUser.image = UIImage(named: value?["image"] as? String ?? "")!
            completion(defaultUser)
        }) { (error) in
            print("hello")
            print(error.localizedDescription)
        }
        self.user = defaultUser
    }
}

我尝试了之后仍然没有工作:

class ItemsTableViewController: UITableViewController {

    // MARK: Constants
    let listToUsers = "ListToUsers"

    // MARK: Properties
    var user: User!
    let ref = Database.database().reference()

    override func viewDidLoad() {
        super.viewDidLoad()
        let use = Auth.auth().currentUser?.uid
        self.getUserData(uid:use!) { (user) -> () in
            self.user = user
        }
}

func getUserData(uid:String , completion: @escaping (User) -> ()) {
        ref.child("users").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
                let value = snapshot.value as? NSDictionary
                let defaultUser = User()
                defaultUser.uid = uid
                defaultUser.email = value?["email"] as? String ?? ""
                defaultUser.name = value?["name"] as? String ?? ""
                defaultUser.grad = value?["grad"] as? Int ?? 0
                defaultUser.number = value?["number"] as? String ?? ""
                defaultUser.image = UIImage(named: value?["image"] as? String ?? "")!
                completion(defaultUser)
        }){ (error) in
            print("hello")
            print(error.localizedDescription)
        }
    }

【问题讨论】:

  • self 是类还是结构?我们需要更多的上下文来理解这里的问题。如果 self 按值传递,您可能正在修改复制到块上下文中的第二个 self 实例,而不是原始引用。
  • self 只是来自班级。 user 定义为:var user: User!,这是我创建的一个包含上述变量的类。分配发生在覆盖 func viewDidLoad() { 函数中。我马上更新

标签: ios swift firebase asynchronous firebase-realtime-database


【解决方案1】:

Firebase 是异步的,第一个代码块中的 self.user = defaultUser 将在 Firebase 有机会返回数据之前被调用。

数据仅在 Firebase 调用之后的闭包内有效。所以这里是如何解决它。哦,并删除该错误代码,因为它不需要。

假设这样的用户结构

users
  uid_0
    name: "some name"
    email: "some email"

以及读取 uid_0 并填充全局(即类 var)用户的代码

class MyUser {
    var uid = ""
    var name = ""
    var email = ""

    init(aUid: String, aName: String, aEmail: String) {
        self.uid = aUid
        self.name = aName
        self.email = aEmail
    }
}

var user: MyUser!

func readOneUser() {
    let uid = "uid_0"
    let thisUserRef = self.ref.child("users").child(uid)
    thisUserRef.observeSingleEvent(of: .value, with: { snapshot in
        //let uid = snapshot.key if you don't know the uid, it will be the key to the node
        let name = snapshot.childSnapshot(forPath: "name").value as? String ?? "No Name"
        let email = snapshot.childSnapshot(forPath: "email").value as? String ?? "No Email"
        self.user = MyUser(aUid: uid, aName: name, aEmail: email)
        print(self.user.name) //do something with the user here
    })
}

还有这一行

defaultUser.image = UIImage(named: value?["image"] as? String ?? "")!

需要解决,但我不知道意图是什么。如果发生这种情况,它最终可能会为零

defaultUser.image = UIImage(named: "")!

因此您可能希望使用某种默认图像填充它,或者在它为 nil 时提供错误处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-03
    • 2015-09-07
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多