试图获取另一个VC中的historyRef的值,它返回nil。我尝试了不同的解决方案(包括我正在使用的解决方案),但似乎无法获得在viewDidLoad()中声明的historyRef变量的实际值。
Firebase数据库具有一个节点“ history”,该节点在MainVC中具有一个键(childByAutoId())。我正在尝试在SecondVC中访问该密钥。
在MainVC中是一个常量:
var historyRef : FIRDatabaseReference!
var ref : FIRDatabaseReference!
还声明了实例:
private static let _instance = MainVC()
static var instance: MainVC {
return _instance
}
viewDidLoad():
historyRef = ref.child("history").childByAutoId()
SecondVC
class SecondVC: UIViewController {
var mainVC : MainVC? = nil // hold reference
override func viewDidLoad() {
super.viewDidLoad()
mainVC = MainVC() // create MainVC instance
getUserHistoryIds()
}
func getUserHistoryIds() {
let historyKey = mainVC?.historyRef
print("HistoryKey: \(String(describing: historyKey))")
}
}
打印输出:
HistoryKey: nil
我的数据库:
my-app
- history
+ LSciQTJwR0VqwaAfKVz
我不是从另一个控制器那里得到的,而是从Firebase那里得到的。
我能够获取childAutoById的值,但它列出了所有这些值,而不仅仅是当前值:
let historyRef = ref.child("history")
historyRef.observe(.value) { (snapshot) in
if snapshot.exists() {
for history in snapshot.children {
let snap = history as! FIRDataSnapshot
let _ = snap.value as! [String: Any] // dict
let historyKey = snap.key
print("History Key: \(historyKey)")
}
} else {
print("There are none")
}
}
答案 0 :(得分:0)
您正在用viewDidLoad方法初始化MainVC :: historyRef,但是仅从SecondVC实例化MainVC不会导致MainVC的加载或显示。
您可以使用mainVC = MainVC.instance,但是您依赖于MainVC实例先前已加载并且没有以其他方式丢弃。
我想从与VC无关的地方提取任何模型用法,并在需要时作为segue的一部分传递给VC。
答案 1 :(得分:0)
初始化MainVC时,将历史记录引用从viewDidLoad移到init()。这样,该方法将在实例化视图控制器后立即运行。还要确保这不是一个异步调用,或者像您提到的那样使用Firebase添加完成回调以知道何时完成。
model_glove.add(LSTM(100))
在实例化MainVC但从不加载它时,historyRef将永远不会运行。
也不建议将视图控制器作为静态对象。我宁愿通过初始化程序或视图模型将变量向下传递。
答案 2 :(得分:-1)
从您的编辑中可以看到,我无法通过控制器之间的传递来获得所需的东西,所以我只是从firebase数据库中获得了它:
let historyRef = ref.child("history")
historyRef.observe(.value) { (snapshot) in
if snapshot.exists() {
for history in snapshot.children {
let snap = history as! FIRDataSnapshot
let _ = snap.value as! [String: Any] // dict
let historyKey = snap.key
print("History Key: \(historyKey)")
}
} else {
print("There are none")
}
}
这将获得所有随机密钥,而不是当前的密钥,我可以使用它。