2014-06-25 11 views
27

Moja aplikacja wykorzystuje Firebase do synchronizowania i przywracania danych. Używam metody setValue:withCompletionBlock: do wstawiania, aktualizowania i usuwania obiektów Firebase. Ta metoda jest wywoływana gdy istnieje CoreData oszczędzania, więc wszystkie moje synchronizacji lokalnych zmian FirebaseTrwałość Firebase, wyczyść pamięć podręczną Firebase

- (void) setValue:(id)value withCompletionBlock:(void (^)(NSError* error, Firebase* ref))block; 

Teraz synchronizacją przesłane wszystkie lokalne dane do Firebase, podczas przywracania zastępuje lokalnych danych z danymi Firebase.

- (void) observeSingleEventOfType:(FEventType)eventType withBlock:(void (^)(FDataSnapshot* snapshot))block; 

Obserwuję FEventTypeValue i użyć FDataSnapshot aby uzyskać dane z Firebase i przywrócić dane lokalne.

Wszystko działa idealnie, dopóki nie ustawię persistence na Firebase.

[Firebase setOption:@"persistence" to:@YES]; 

Teraz kiedy persistence jest włączony, kiedy aktualizować powiedzieć wstawić obiekt do Firebase, a następnie przywrócić dane przed przywróceniem wstawiania. tj. nowo wstawiony obiekt nie zostanie przywrócony. Jeśli jednak przywrócę ponownie, wstawiony obiekt zostanie przywrócony. To samo dzieje się, gdy obiekt zostanie usunięty. Usuwany obiekt pojawia się ponownie, gdy przywracam po raz pierwszy i znika po ponownym przywróceniu. Widzę, że obiekty Firebase są prawidłowo wstawiane i/lub usuwane przez widok danych Firebase.

Nie jestem pewien, co robię źle tutaj. Mam problem tylko po przywróceniu. Myślę, że pamięć podręczna Firebase powoduje ten problem przywracania. Zastanawiam się, czy wyczyścić pamięć podręczną Firebase, zanim ją przywrócę. Moje pytanie brzmi:

  1. Czy wyczyszczenie pamięci podręcznej przed przywróceniem dobrej metody?
  2. Jeśli tak, jak wyczyścić pamięć podręczną Firebase?
  3. Jeśli nie, czy możesz zaproponować mi najlepszą metodę przywracania danych.

Odpowiedz

24

To jest niestety oczekiwane zachowanie w obecnej wersji beta trwałości dysku. Prawdopodobnie możesz obejść to, używając metody obserwujEventOfType zamiast obiektu obserwujSingleEventOfType

Zasadniczo, gdy obserwujesz dane, najpierw będziemy pobierać dane z naszej trwałej pamięci podręcznej. Te dane będą danymi, które otrzymaliśmy ostatnio od Firebase. Ponieważ używasz metody obserwujElectelEventOfType zamiast parametru obserwujEventOfType, nie otrzymasz regularnych aktualizacji od Firebase, więc dane, które mamy w pamięci podręcznej, faktycznie nie będą zawierały najnowszych danych, które napisałeś.

Jako prostą poprawkę, możesz po prostu dodać parametrobserwEventOfType do danych, o których mowa. Nie musisz nic robić ze zdarzeniami. Ale jeśli będziesz ich słuchać przez cały czas, aplikacja będzie pobierać najnowsze dane z bazy Firebase, a gdy zadzwonisz do obiektu noticeSingleEventOfType, możesz mieć pewność, że będzie on zawierał najnowsze dane.

To jest trochę hacky i zamierzamy uprościć ten interfejs API przed zwolnieniem funkcji trwałości w formie innej niż beta. Przepraszamy za ból!

+7

Czy to nadal ma miejsce? Wygląda na to, że wpadłem na ten problem. Sprawdź, czy istnieje nazwa użytkownika, jeśli nie, utwórz użytkownika. Jeśli użytkownik się wyloguje i spróbuje utworzyć nowego użytkownika o tej samej nazwie, zadziała, ponieważ pamięć podręczna nie zostanie zaktualizowana. –

+6

Jestem wielkim fanem Firebase. Ale muszę powiedzieć szczerze, że to duże ograniczenie. Firebase powinien dodać nowy parametr w metodzie 'fetchNewData: Bool'.Oczekiwane zachowanie, które jest nieoczekiwane, nie jest oczekiwanym zachowaniem. Istnieje wiele przypadków, w których może to się nie udać, np. Paginacja. Większość z nas nie zauważyłaby wartości strony dla strony podczas dzielenia na strony, w przeciwnym razie poprzednia strona mogłaby zostać odświeżona, a sama koncepcja dzielenia na strony (aby zmniejszyć transfer danych) stała się bezużyteczna, ponieważ metoda obserwacji utrzymuje odświeżanie danych poprzedniej strony, oraz nie możemy również użyć 'removeObserver' –

+0

Dowolną poprawkę do tego? – Relm