2016-05-27 3 views
0

Так что мне нужно захватить содержимое с разных путей в базе данных firebase и сохранить их в массив, чтобы я мог поместить их в диаграмму.Swift - Firebase multiple snapshots

Есть ли способ получить snapshot.Value и сохранить его в переменной, доступ к которой может быть получен позднее в коде?

Это код, который показывает, что я пытаюсь сделать:

override func viewDidLoad() { 
    super.viewDidLoad() 

    leave.observeEventType(.Value, withBlock: { snapshot in 
     let vaiable = snapshot.value 
    }) 

    remain.observeEventType(.Value, withBlock: { snapshot in 
     let variableTwo = snapshot.value 
    }) 

    undecided.observeEventType(.Value, withBlock: { snapshot in 
     let vaiableThree = snapshot.value 
    }) 

    let options = ["Remain", "Leave", "Undecided"] 
    let results = [variable, variableTwo, variableThree] 
    setChart(options, values: results) 

Но я считаю, что firebase вызовы делаются в последнюю очередь, это означает, что переменные являются пустыми в массиве «Результаты» ,

Все, что мне не хватает?

+0

Пожарные базовые вызовы - это асинхронные вызовы, так что либо вы должны соединить все вызовы, а если вы хотите провести параллель, то подождите, пока все блоки завершения завершатся. –

ответ

0

Прежде всего, у вас есть проблема с «областью». Переменная, объявленная внутри функции или обратного вызова, никогда не будет доступна извне этой функции или обратного вызова.

Одним из вариантов решения вашей проблемы может быть, как это:

var results: [FIRDataSnapshot] = [] 
override func viewDidLoad() { 
    super.viewDidLoad() 

    leave.observeEventType(.Value, withBlock: { snapshot in 
    self.results.append(snapshot.value) 
}) 

remain.observeEventType(.Value, withBlock: { snapshot in 
    self.results.append(snapshot.value) 
}) 

undecided.observeEventType(.Value, withBlock: { snapshot in 
    self.results.append(snapshot.value) 
}) 

Но теперь вы действительно не имеют возможности узнать погоду или не ваш results массив фактически заполняется любыми данными, или если обратные вызовы все еще предстоит завершить.

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

+1

Спасибо за ответ. Мне удалось исправить это другим способом, который работает для моих целей и целей, но считаю, что это более правильный ответ. – dwinnbrown