Добавить данные Firebase в массив в Swift

Я не знаю, что я делаю не так! Я просто хочу взять данные из базы данных Firebase, выполнить итерации для каждого результата и поместить их в массив. Я пробовал сервал разные подходы. Но все они возвращают результаты, добавляя по одному в массив. В результате массив выглядит следующим образом:

["1"]
["1","2"]
["1","2","3"]
["1","2","3","4"]

как вы можете видеть, он добавляет один объект при каждой итерации. Вот что у меня есть:

let ref = FIRDatabase.database().reference().child("users")
ref.observeEventType(.ChildAdded, withBlock: { snapshot in
    userUrl = snapshot.value?["profile_image_1"] as! String
    imageArray.insert(userUrl, atIndex: 0)
}, withCancelBlock: { error in
    print(error.description)
}) 

и я также попробовал это:

let userUrl = (snapshot.value.objectForKey("profile_image_1")) as! String
imageArray.append(userUrl)

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

["1","2","3","4"]

Любая помощь будет отличной!

База данных: структура базы данных Firebase

2 ответа

Решение

Попробуйте что-то вроде этого:

var imageArray = []

func appendData(){
    let ref = FIRDatabase.database().reference().child("users") 

    ref.observeEventType(.Value, withBlock: { snapshot in
        var tempImageArray = []

        for user in snapshot.children {
            userUrl = user.value?["profile_image_1"] as? String
            self.imageArray.insert(userUrl, atIndex: 0)
            tempImageArray.append(broadcastItem)
        }

        self.imageArray = tempImageArray
    })
}

редактировать: я обновил код, пожалуйста, попробуйте это.

Это не дает прямого ответа на вопрос, но я предполагаю, что вы хотите получить доступ к окончательным данным после того, как все добавлено.

У меня была та же проблема, и я решил ее, выполнив ту же самую вещь, которую вы делаете, затем я создал dispatchQueue внутри блока завершения.

let ref = FIRDatabase.database().reference().child("users")

ref.observeEventType(.ChildAdded, withBlock: { snapshot in
    userUrl = snapshot.value?["profile_image_1"] as! String
    imageArray.insert(userUrl, atIndex: 0)

 DispatchQueue.main.async(execute: {

 //access the final array here.

  }
}) 

Надеюсь, это поможет.

Другие вопросы по тегам