Firebase:保留在observeSingleEvent中分配的值[重复]

Posted

技术标签:

【中文标题】Firebase:保留在observeSingleEvent中分配的值[重复]【英文标题】:Firebase: keep values assigned in observeSingleEvent [duplicate] 【发布时间】:2020-02-16 08:19:03 【问题描述】:

我正在 Swift 中从 Firebase 数据库中读取数据,然后想在稍后的函数中使用长度,但是我丢失了使用:闭包完成的分配。 AKA 这两个 print(length!) 打印不同的值。我怎么能记住这个分配,无论它是 Swift 中闭包的解决方法还是通过 Firebase 调用保存保存值的方法。

var length:Int? = 1
        ref.child("Config").observeSingleEvent(of: .value, with:  (snapshot) in
                let value = snapshot.value as? NSDictionary
                length = (value?["AcademicBuildingsLength"] as? Int ?? 0)
                print(length!)
            )
        print(length!)

【问题讨论】:

Firebase 闭包是异步的,其值仅在闭包内有效。您可以将值存储为类 var;或利用完成处理程序将值传递回调用函数。见this answer,然后是我对this question的回答 【参考方案1】:

要在同一个类中使用您的长度属性,只需在类中声明它,如下所示:

var length: Int?

override func viewDidLoad() 
    //...

要在其他类中使用您的长度属性,请考虑将属性设为全局:

public struct GlobalProperties 

    static var length: Int?


在闭包中赋值:

ref.child("Config").observeSingleEvent(of: .value, with:  (snapshot) in
            let value = snapshot.value as? NSDictionary
            length = (value?["AcademicBuildingsLength"] as? Int ?? 0)

            // Assign value to length property
            self.length = length //if value is used within this class
            GlobalProperties.length = length //if value is used elsewhere
        )

顺便说一句。您的 print 语句打印不同值的原因是因为底部打印是在异步 firebase 函数完成之前执行的。您应该只在闭包内获取长度值。

【讨论】:

我相信这个答案建议使用单例设计模式。使用 Swift,通常有比 Singletons 更优雅的选项 - 虽然它们有它们的用途,但如果使用不当,它们可能会导致内存问题和强引用。类级别的 var 可能更适合这里,但委托函数、完成处理程序(回调)和 segue 可能更符合要求,因为所有这些都会保持对 var 的弱引用,因此可以将其处理掉。这是一本好书Are singletons bad

以上是关于Firebase:保留在observeSingleEvent中分配的值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Firebase 中为“用户”保留“帖子”参考

Firebase:保留在observeSingleEvent中分配的值[重复]

如何保留不同版本的 Firebase?

关闭应用程序时将 Firebase 侦听器保留在内存中

Firebase 令牌在 1 小时内过期后如何保留用户?

未记录 first_name 用户属性,它是不是保留在 firebase 分析中?