2012-08-16 14 views
14

Buduję aplikację internetową za pomocą Firebase, która pobiera te same dane i przedstawia je na dwa różne sposoby - na liście i jako znaczniki na mapie google.Firebase - czy buforowanie poprawia wydajność?

Teraz, w każdym widoku - mapa lub lista - mam kod do wyszukiwania danych z bazy Firebase, łączenia ich razem i wyświetlania. Zamiast tego rozważam ten plan: po uruchomieniu przeszukuj dane, scalaj je i zapisuj wszystkie w tablicy, którą przekazuję z widoku do obejrzenia.

W pewnym sensie "buforuję" dane bazy ogniowej w tablicy. To nie jest idealne w jednym znaczeniu - dane w pamięci podręcznej nie są tak aktualne, jak bezpośrednie wysyłanie zapytań do Firebase. Z drugiej strony dzwonię do Firebase tylko raz.

Czy to ma sens? Czy odczytywanie danych z bazy Firebase odbywa się w tym samym przedziale czasowym, co odczyt danych z tablicy?

Odpowiedz

21

Ogólnie buforowanie danych w celu ograniczenia wykorzystania Firebase jest niepotrzebne. Firebase utrzymuje własny bufor "aktywnych" danych na kliencie. "Aktywny" jest zdefiniowany jako dane, dla których jest aktywne połączenie "włączone". Dlatego w przypadku aktywnych danych wszelkie dodatkowe połączenia "włączone" lub "jednorazowe" nie wymagają ruchu sieciowego, ponieważ dane zostały już załadowane.

Nie jestem do końca pewien, co masz na myśli przez "zapytanie o bazę ogniową". Firebase nie ma zapytań w tradycyjnym znaczeniu. Po prostu ma metody dołączania wywołań zwrotnych. Czy używasz funkcji "raz()", aby otrzymywać okresowo dane z Firebase? Jeśli tak, może to być bardzo nieefektywne. Jest to metoda wygodna i powinna być używana tylko w przypadku danych, do których dostęp jest uzyskiwany niezwykle rzadko lub z jakiegoś powodu programista nie chce aktualizować w czasie rzeczywistym. Jeśli żadne aktywne połączenia "włączone" nie zostaną zakończone, gdy operacja once() zostanie zakończona, Firebase opróżni pamięć podręczną tych danych, a każde kolejne wywołanie funkcji once() będzie wymagało objazdu na serwerze.

Jeśli to, co chcesz to sposób synchroniczny dostęp do lokalnej kopii najnowszej wersji danych w sposób efektywny, polecam tej metody:

var savedSnapshot = null; 
dataRef.on("value", function(snapshot) { 
    savedSnapshot = snapshot; 
}); 

//and then when you need to read the data 
var theData = savedSnapshot.val() 

Utrzymując jeden singiel() połączenia, Firebase jest w stanie aktualizować twoje dane, wysyłając delty przez kabel tylko wtedy, gdy coś się zmienia, zamiast przeładowywać wszystkie dane za każdym razem, gdy ich potrzebujesz.

+1

Świetne wyjaśnienie. Dokumenty, przy okazji, dają takie wrażenie, ale nie wdają się w tak wielkie szczegóły (może to być świetny dodatek do dokumentów). – Kato

+1

W niedalekiej przyszłości planujemy dodać do dokumentów pewne sekcje dotyczące wydajności. –

+0

@AndrewLee czy ta sekcja wydajności kiedykolwiek zostanie napisana? Używam Firebase od 2 lat i nie "kliknąłem" dokładnie tak, jak to zrobiłem, kiedy ta (5-letnia) odpowiedź wyjaśniła, w jaki sposób można przechowywać dane do przechowywania danych do późniejszego wykorzystania. Zdaję sobie teraz sprawę, że dość często koduję defensywnie, z obawy przed tym, że nie wiem, co robi Firebase i nie "cache" wewnętrznie. Teraz widzę, że DataSnapshot jest tylko nawigacyjnym kursorem do wewnętrznej niezmiennej struktury danych, i że 'val()' klonuje swoje dane do POJO. To jest tak elegancko zaprojektowane! Czapki z głów :-) – skrebbel