Добавить данные 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.
}
})
Надеюсь, это поможет.