Странное поведение при запросе данных из базы данных Firebase - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь записать некоторые данные в базу данных Firebase, но у меня неправильный процесс.Может ли кто-нибудь помочь мне с этим?Большое спасибо!!

Древовидная структура JSON выглядит следующим образом:

{ 
    "cars": {

        "auto id": [

            "parts": "wheel"
             ...
    .
    .
    .



@objc func buttonTapped(){

    print("before running")
        var ref = Database.database().reference(withPath: "cars").queryOrdered(byChild: "parts").queryEqual(toValue: "wheel")
            ref.observeSingleEvent(of: .childAdded, with: { (snapshot) in
            autoId = snapshot.key
            print("running")
        }) { (error) in
            print(error.localizedDescription)
        }
print("after running")
let newPlanetRef = Database.database().reference().child("company").childByAutoId()
                    newPlanetRef.updateChildValues(autoId)
}

Я ожидаю, что запущенный процесс

"перед запуском" -> "запуск" ->"после запуска"

Но фактический процесс

"до запуска" -> "после выполнения" -> "выполнение" И данные не могут быть обновлены в базе данныхесли я не поставлю функцию обновления внутри замыкания

1 Ответ

2 голосов
/ 05 июля 2019

Это асинхронный процесс.

Вы должны использовать так:

var newPlanetRef: String? //It should be your reference type

var ref = Database.database().reference(withPath: "cars").queryOrdered(byChild: "parts").queryEqual(toValue: "wheel")
        ref.observeSingleEvent(of: .childAdded, with: { (snapshot) in
        autoId = snapshot.key
        newPlanetRef = Database.database().reference().child("company").childByAutoId()
        newPlanetRef.updateChildValues(autoId)
        print("running")
    }) { (error) in
        print(error.localizedDescription)
    }

Но я думаю использовать вот так:

  • Создать закрытое перечисление для ваших ссылочных ключей:

    private enum ReferenceKeys {
        static let carsKey = "cars"
    }
    
  • Создание глобальных переменных для ссылок на вашу базу данных:

    var database = Database.database()
    var databaseReference = database.reference()
    var carReference = database.reference(withPath: ReferencesKeys.carsKey)
    
  • Используйте свою функцию так:

    var newPlanetRef: String?
    
    var reference = carReference.queryOrdered(byChild: "parts").queryEqual(toValue: "wheel")
    
    reference.observeSingleEvent(of: .childAdded, with: { [weak self] snapshot in
    
        self?.autoId = snapshot.key
        newPlanetRef = databaseReference.child("company").childByAutoId()
        newPlanetRef.updateChildValues(autoId)
    
        print("running")
    }) { error in 
    
        print(error.localizedDescription)
    }
    

Бонус:

Вы можете использовать dispatchGroup (или семафор) для ожидания значения снимка для продолжения:

DispatchGroup

@objc func buttonTapped(){

    let dispatchGroup = DispatchGroup()

    print("before running")
    var ref = Database.database().reference(withPath: "cars").queryOrdered(byChild: "parts").queryEqual(toValue: "wheel")

    dispatchGroup.enter()
    ref.observeSingleEvent(of: .childAdded, with: { [weak self]snapshot in
            self?.autoId = snapshot.key

            dispatchGroup.leave()
            print("running")
    }) { (error) in
            print(error.localizedDescription)
    }
    print("after running")
    let newPlanetRef = Database.database().reference().child("company").childByAutoId()
    newPlanetRef.updateChildValues(autoId)
}

DispatchSemaphore

@objc func buttonTapped(){

    let dispatchSemaphore = DispatchSemaphore(value: 1)

    print("before running")
    var ref = Database.database().reference(withPath: "cars").queryOrdered(byChild: "parts").queryEqual(toValue: "wheel")

    ref.observeSingleEvent(of: .childAdded, with: { [weak self]snapshot in
            self?.autoId = snapshot.key
            semaphore.signal()

            print("running")
    }) { (error) in
            print(error.localizedDescription)
    }

    semaphore.wait()

    print("after running")
    let newPlanetRef = Database.database().reference().child("company").childByAutoId()
    newPlanetRef.updateChildValues(autoId)
}

Завершение

@objc func buttonTapped(){

    getData { [weak self] snapshotKey in
        self?.autoId = snapshot.key
        let newPlanetRef = Database.database().reference().child("company").childByAutoId()
        newPlanetRef.updateChildValues(self?.autoId)
    }
}

/// completion type -(String?)- must be a snapshot.key's type
func getData(_ completion: @escaping (String?) -> Void) {

    print("before running")
    var ref = Database.database().reference(withPath: "cars").queryOrdered(byChild: "parts").queryEqual(toValue: "wheel")

    ref.observeSingleEvent(of: .childAdded, with: { snapshot in
            completion?(snapshot.key)

            print("running")
    }) { (error) in
            print(error.localizedDescription)
    }

    print("after running")

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...