Чтение данных Firebase назначить значение - PullRequest
0 голосов
/ 07 мая 2019

Я хочу присвоить данные, которые я прочитал в базе данных Firebase, значениям, которые я дал в коде. Данные читаются в коде, который я дал, но значения не присваиваются. Я хочу назначить deviceroom1, deviceRoom2, deviceRoom3, deviceRoom4.

    var deviceRoom1: String = ""
    var deviceRoom2: String = ""
    var deviceRoom3: String = ""
    var deviceRoom4: String = ""
    var deviceRoom5: String = ""

 func fetchDevies(){

        let ref = Database.database().reference().child(self.chip1InfoString!).child("Rooms")

        ref.observeSingleEvent(of: .value, with: { (snapshot) in
            let value = snapshot.value as? NSDictionary

            if let deviceRooms1 = value?["Rooms1"] as? String  {
                self.deviceRoom1 = deviceRooms1

            }
            if let deviceRooms2 = value?["Rooms2"] as? String {
                self.deviceRoom2 = deviceRooms2

            }
            if let deviceRooms3 = value?["Rooms3"] as? String {
                self.deviceRoom3 = deviceRooms3

            }
            if let deviceRooms4 = value?["Rooms4"] as? String {
                self.deviceRoom4 = deviceRooms4

            }
            if let deviceRooms5 = value?["Rooms5"] as? String {
                self.deviceRoom5 = deviceRooms5

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

                let items = [deviceRoom1, deviceRoom2, deviceRoom3, deviceRoom4, deviceRoom5]

1 Ответ

1 голос
/ 09 мая 2019

Эта проблема заключается в том, что Firebase является асинхронным, поэтому вам нужно дать Firebase время для извлечения и возврата запрошенных данных. то есть данные действительны только в закрытии.

Ваш код присваивает значения с let items = ... вне замыкания, и этот код будет выполняться до того, как данные будут возвращены. Переместите назначение внутрь, как замыкание, вот так (для краткости код сокращен)

func fetchDevies() {
    let ref = Database.database().reference().child("some_node").child("Rooms")
    ref.observeSingleEvent(of: .value, with: { snapshot in
        let value = snapshot.value as? NSDictionary

        if let deviceRooms1 = value?["Rooms1"] as? String  {
            self.deviceRoom1 = deviceRooms1
        }
        .
        .
        .
        let items = [self.deviceRoom1, self.deviceRoom2, self.deviceRoom3, self.deviceRoom4, self.deviceRoom5]
        print(items)
    })

    //code here will run before Firebase has returned data and populated the vars

Также будьте осторожны с именами переменных. Если вы обращаетесь к классу var, всегда обращайтесь к нему с помощью self. как self.deviceRoom1

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