在另一个控制器中获取常量的值始终使用Swift返回nil

时间:2018-12-05 00:03:46

标签: ios swift firebase firebase-realtime-database

试图获取另一个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")
        }
    }

3 个答案:

答案 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")
    }
}

这将获得所有随机密钥,而不是当前的密钥,我可以使用它。