У меня есть рабочее соединение с базой данных Firebase в реальном времени. Наблюдение за событием запускается нажатием кнопки IBAction. Первый вызов для получения данных не удается. Второй пу sh кнопки извлекает данные ОК. Какой будет способ получить данные с первого звонка? Я несколько раз пытался вызвать Наблюдение заитами, нажал кнопку программно и добавил ожидание, чтобы завершить процесс наблюдения. Даже добавил блок завершения при отчаянии. Любая подсказка о том, что я делаю неправильно, будет принята с благодарностью.
--- EDIT ---
Исправлен код ниже, как предложено @rob. Единственным дополнением к ответу Роба было то, что @escaping был необходим в определении блока завершения. Теперь работает прекрасно.
var prodNo: String = "XXX000000"
var productDataLocal: [String: String] = ["ProdNo": "", "Location": ""]
@IBAction func findTapped(_ sender: Any) {
fetchFirebaseData { () -> () in
if productDataLocal["ProdNo"] == prodNo { // check that the data matches the product
// launch a segue (that is detached from button)
self.performSegue(withIdentifier: "moveToDetail", sender: nil)
}
else {
showError("Product \(prodNo) can't be found.")
}
}
} // findTapped
func fetchFirebaseData(completion: @escaping () -> ()) { // --- EDIT ---@escaping addedd
// check if this product can be found in Firebase!
self.ref.child("Id").child("\(prodNo)").observeSingleEvent(of: .value, with:
{ (snapshot) in
// try if this product can be found in Firebase
let tempData = snapshot.value as? Dictionary<String, Any>
if let actualData = tempData {
self.copyData(actualData)
}
completion() // --- EDIT --- completion moved here
}) { (error) in
print(error.localizedDescription)
completion() // --- EDIT ---and completion moved here
}
// --- EDIT -- completion() removed from here
} // fetchFirebaseData
func copyData(_ actualData: Dictionary<String, Any>) {
dump(actualData) // for debugging what "actualData" actually contains
// this is always OK when execution gets here
self.productDataLocal["ProdNo"] = actualData["ProdNo"] as? String
self.productDataLocal["Location"] = actualData["Location"] as? String
}
Дамп «фактических» данных работает и выдает правильные данные - когда они выполняются. Проблема в том, что я не могу найти способ выполнить этот код, кроме как нажать кнопку во второй раз. (И да, «ProdNo» повторяется в структуре JSON, чтобы я мог проверить, соответствует ли он номеру запрашиваемого продукта.) --- EDIT --- код, приведенный выше, теперь работает и проблема решена
▿ 2 key/value pairs
▿ (2 elements)
- key: "ProdNo"
- value: XXX000000 #0
- super: NSMutableString
- super: NSString
- super: NSObject
▿ (2 elements)
- key: "Location"
- value: "Warehouse 1" #1
- super: NSMutableString
- super: NSString
- super: NSObject