【问题标题】:Access Data Outside of Closure, Firebase ObserveSingleEvent // SWIFT在关闭之外访问数据,Firebase ObserveSingleEvent // SWIFT
【发布时间】:2017-04-15 16:58:47
【问题描述】:

当我第一次问这个问题时,我并没有真正完成我的研究。但是经过 20 多个小时后,我的结构与 Firebase 文档中的完全一样。但是,我无法访问闭包之外的任何数据。这是数据应该写入的结构:

    struct UserStruct {
        let name : String!
        let age : String!
    }

当它被调用时,数据库中的一切都写得很完美,在闭包内它不会打印 nil,它显然会打印实际值。我已经试过了

    DispatchQueue.main.async {

    }

但这也不起作用,有人指导我!感谢您提供任何帮助,这是我使用 Firebase 的最后一个问题。

     let currentUser = FIRDatabase.database().reference(withPath: "users").child((FIRAuth.auth()!.currentUser?.uid)!)
        currentUser.observeSingleEvent(of: .value, with: { snapshot in
        let value = snapshot.value as? NSDictionary
        let name = value?["name"] as? String
        let age = value?["age"] as? String
        self.userAdded.insert(UserStruct(name: name, age: age), at: 0) // 1
        let user = UserStruct.init(name: name, age: age) // 2

        print("1 \(user.name)")
        print("2 \(self.userAdded[0].name!)")
    })

我写了两种获取数据的方法,第二 (2) 是 Firebase 建议的方式,但我什至无法像使用 Struct 那样在更近的地方获得用户。

【问题讨论】:

  • 不清楚你在问什么。 firebase 数据在闭包内有效,因此例如您要填充 tableView。您观察所需的节点,然后在闭包内返回数据。您遍历快照并填充一个数组(在闭包外部定义),一旦完成,tableView.reload(仍在闭包内)。从那时起,您的数据将存储在数组中并且可以使用。你根本不需要 DispatchQueue.main.async。

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


【解决方案1】:

当闭包完成它必须做的事情时,你在闭包中创建的 user 对象将被释放。正如@Jay 在评论中所说,您需要将在闭包中获得的数据存储在闭包的 outside 变量中。一种快速而肮脏的测试方法是在您所在的类中创建一个变量,并将您在闭包中创建的 user 分配给该变量,然后将其打印出来以查看它是否有效:

//add a property in your class to store the user you get from Firebase
var retrievedUser: UserStruct?

let currentUser = FIRDatabase.database().reference(withPath: "users").child((FIRAuth.auth()!.currentUser?.uid)!)
currentUser.observeSingleEvent(of: .value, with: { snapshot in
    let value = snapshot.value as? NSDictionary
    let name = value?["name"] as? String
    let age = value?["age"] as? String

    let user = UserStruct.init(name: name, age: age)

    //assign the user retrieved from Firebase to the property above
    self.retrievedUser = user
    //print the local copy of the retrived user to test that it worked
    print(retrievedUser)
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-05
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多