Захват данных FireSBase в реальном времени наблюдать за ошибкой при первом вызове - PullRequest
1 голос
/ 03 апреля 2020

У меня есть рабочее соединение с базой данных 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

1 Ответ

1 голос
/ 03 апреля 2020

Вы вызываете свой блок завершения синхронно. Вы не должны вызывать его, пока НаблюдениеSingleEvent не завершится. Если вы перенесете свой блок завершения в свой обработчик наблюденийSingleEvent, вы должны получить результаты, которые вы ищете:

func fetchFirebaseData(completion: @escaping () -> ()) { // --- EDIT --- added "@escaping
    // 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()
        }) { (error) in
            print(error.localizedDescription)
            completion()
        }
}  // fetchFirebaseData
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...