2017-03-31 11 views
5

Tło:observeSingleEvent (z: o :) ściągam stare dane

Mam app gdzie nowi użytkownicy wypełnić formularz rejestracji w górę (na które składają się podając nazwę użytkownika, adres e-mail i hasło), aby założyć konto. Gdy nowy użytkownik przesyła formularz, aplikacja sprawdza bazę danych Firebase, aby sprawdzić, czy nazwa użytkownika została już pobrana. Problem polega na tym, że observeSingleEvent(of:with:) nie otrzymuje najnowszych danych. Gdy aktualizuję dane bezpośrednio z konsoli Firebase, zmiany nie są odzwierciedlane w zwracanych wynikach observeSingleEvent(of:with:). Nawet między kolejnymi uruchomieniami aplikacji nowe zmiany danych nie są zwracane.

Jedyne, co widziałem w tej sprawie to here. Użytkownik twierdzi, że nie ma włączonej trwałości podczas używania observeSingleEvent(of:with:). Ale mam uporczywe upośledzenie. Ponadto ustawiam keepSynced() na instancji FIRDatabase na wartość false (i próbowałem również prawdy). Nie ma szczęścia przy obu ustawieniach.

Oto przykład tego, co usiłuję:

let usersDatabaseReference = FIRDatabase.database().reference().child("users") 
usersDatabaseReference.keepSynced(false) 

// Query the database to see if the username is available 
// The user with the username "mark" was removed from the database via the Firebase console 
let username = "mark" // This user used to exist in the database (and was previously added through the app). 
usersDatabaseReference.child(username).observeSingleEvent(of: .value, with: { (snapshot) in ... }) 

Powyższy fragment kodu powinien zwrócić najnowsze dane (jeden gdzie użytkownik „znak” nie powinien istnieć).

Zastanawiam się, czy ktoś inny wpadł na ten problem, lub czy ktoś ma możliwe rozwiązania.

Uwaga: Rozwijanie użyciu iOS 10.1 i szybkie 3.

Odpowiedz

0

Więc mój problem nie miał nic wspólnego z buforowania lub pobieranie starych wyników. Część mojej logiki kodu zależała od sprawdzenia parametru value parametru snapshot, który został przekazany z powrotem do programu obsługi zakończenia dla observeSingleEvent(of:with:). Błędnie założyłem, że mogę sprawdzić wartość bazy danych null, porównując ją z nil; doprowadziło to do błędnej interpretacji wyników.

Najlepszym sposobem na sprawdzenie pobierania bazy danych jest wywołanie metody na instancji FIRDataSnapshot. exists() zwraca true, jeśli snapshot zawiera wartość inną niż null.

0

polecam byłaby Twojego modelu danych JSON pomocą użytkownika jako klucza. Powoduje to błąd podczas próby utworzenia duplikatu użytkownika w bazie danych.

+0

Już to zrobiłem. Obecnie w bazie danych znajduje się ścieżka użytkownika. Aby zidentyfikować użytkowników, używam ich nazw użytkowników. – hvasam

1

powrót observeSingleEvent(of:with:) wartość tylko jeden raz

spróbuj tego:

refHandle = postRef.observe(FIRDataEventType.value, with: { (snapshot) in 
    let postDict = snapshot.value as? [String : AnyObject] ?? [:] 
    // ... 
}) 

to doda słuchacza w przypadku bazy link

+0

Dodawanie słuchacza podczas działania aplikacji ma sens. Ale co powiesz na zakończenie aplikacji? Gdy użytkownik ponownie uruchomi aplikację, nie będzie słuchacza, który podejmie odpowiednie zmiany? Jestem przy założeniu, że pamięć podręczna jest związana z czasem, w przeciwieństwie do restartów aplikacji/zmian danych. – hvasam

+0

ponownie uruchomi się ponownie –

+0

Nadal nie działa dla mnie. Jeszcze bardziej dziwne jest to, że ponad godzinę temu przestałem się bawić z aplikacją. It * still * mówi, że nazwa użytkownika została pobrana. – hvasam