2016-06-12 3 views
2

Мы с моим другом работаем над проектом IOS на быстрой с интегрированной Firebase. Мы смогли написать базу данных Firebase, но у нас возникли проблемы с извлечением данных.Хороший способ получить информацию от Firebase Swift

У нас есть контроллер tableView, и мы хотим заполнить таблицу из базы данных Firebase. Наша база данных организованы так:

root 
| 
- Movies 
    |__ -Wjdkfdmlksdf (unique ID made by Firebase) 
     | 
     |_Actors 
      |_A1 = ajkdfnadfdf 
      |_A2 = podifpadsfipasdip 
     |_Title = "Mission Impossible" 
     |_DirectedBy = "Christopher McQuarrie" 
-Actors 
    |_ -ajkdfnadfdf (unique ID made by Firebase) 
     |_name : "Tom Cruise" 
     |_Birthday: xx/yy/zz 

В проекте мы сделали файл/класс, который имеет методы, которые записывают в и извлекающий из firebase. Если мы хотим получить информацию из Firebase для конкретного контроллера представлений, мы просто вызываем конкретный метод из этого класса.

Например, это один из методов в классе:

func getListOfAllMovieIDs() -> [String] { 
    let ref = FIRDatabase.database().reference(); 
    var ListOfMovieIDS = [String](); 
    ref.child("Movies").observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
    let postDict = snapshot.value as! [String : AnyObject] 
    for (MID, _) in postDict { 
     ListOfMovieIDS.append(MID); 
    } 

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

    return listOfMoviesIDS 
} 

мы называем этот метод, который я только что описал выше в viewDidLoad() в tableViewController. Однако метод ничего не возвращает. Мы также назвали другие методы, как получить список уникальных IDS для участников, и это тоже ничего не возвращает. Любое предложение?

ответ

0

Попробуйте использовать ниже метод, потому что, когда вы используете метод observeSingleEventOfType; блок немедленно отменяется после возвращения исходных данных. Это может быть причиной того, что вы не можете увидеть результаты в блоке обратного вызова.

ref.observeEventType(.Value, withBlock: { snapshot in 
    println(snapshot.value) 
}, withCancelBlock: { error in 
    println(error.description) 
}) 
4

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

Вы можете легко увидеть, если поставить некоторые хорошо помещенные заявления протоколирования в вашем коде:

func getListOfAllMovieIDs() { 
    let ref = FIRDatabase.database().reference(); 
    print("Before listener"); 
    ref.child("Movies").observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
     print("Inside block"); 
    }) 
    print("After listener"); 
} 

Порядок заявления печати будет:

Перед слушателем

После слушатель

Внутренний блок

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

Решение, как правило, перефразирует ваш код. Вместо того, чтобы говорить «сначала мы загружаем данные, тогда мы делаем xyz», скажем, что «мы начинаем загружать данные, как только получим, мы делаем xyz». Вот почему методы загрузки данных Firebase берут блок: это содержит «xyz», который должен произойти, как только данные будут доступны.

Хорошим побочным эффектом является то, что эта логика отлично подходит для данных, которые могут быть обновлены после первоначальной загрузки. Когда вы используете objectEventOfType(), вы можете легко обрабатывать ситуации как «начать синхронизацию данных, всякий раз, когда мы получаем данные xyz», и иметь приложение, которое обрабатывает обновления в реальном времени.

Смежные вопросы