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中分配的值[重复]的主要内容,如果未能解决你的问题,请参考以下文章