2017-03-31 61 views
5

Arka Plan getirilirken: bir hesaba kaydolmak içinobserveSingleEvent (bir: ile :) eski verileri

Ben yeni kullanıcıların bir kullanıcı adı, e-posta oluşan bir kayıt formu (tamamlamak bir uygulamayı, ve bir şifre var). Yeni kullanıcı formu gönderdiğinde, uygulama, kullanıcı adının önceden alınmış olup olmadığını görmek için Firebase Veritabanını kontrol eder. Sorun şu ki, observeSingleEvent(of:with:) en yeni verileri almıyor. Verileri doğrudan Firebase konsolundan güncellediğimde, değişiklikler observeSingleEvent(of:with:) döndürülen sonuçlarına geri yansıtılmaz. Uygulama yeniden başlatıldığında bile, yeni veri değişiklikleri iade edilmez.

Sorun üzerinde gördüğüm tek şey here. Bir kullanıcı, observeSingleEvent(of:with:)'u kullanırken kalıcılık sağlamayacağını söylüyor. Fakat ısrarlı olma engelim var. Ayrıca, keepSynced()'u FIRDatabase örneğinde false olarak ayarladım (ve ben de doğruyu denedim). İkisi de şanssız.

İşte çalışıyorum ne bir örnek:

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 ... }) 

Yukarıdaki kod bloğu en yeni veri (kullanıcı "işareti" var olmamalıdır bir) dönmelidir.

Başka birinin bu soruna katılıp çıkmadığını ya da herhangi birinin olası çözümleri olup olmadığını merak ediyorum.

Not: iOS 10.1 kullanılarak geliştirilmesi ve sana anahtar olarak adı kullanarak JSON veri modelini planı ayrı tavsiye 3.

cevap

0

Yani veritabanı olayı bir dinleyici katacak, benim sorunum önbelleğe alma ile ilgisi yoktu ya eski sonuçların alınması. Bazı kod mantığım, observeSingleEvent(of:with:) için tamamlama işleyicisinde geri iletilen snapshot parametresinin value parametresinin kontrol edilmesine bağlıydı. Yanlışlıkla null veritabanı değerini nil ile karşılaştırarak kontrol edebileceğimi varsaydım; Bu sonuçların yanlış yorumlanmasına yol açtı.

Bir null veritabanı getirisini denetlemenin en iyi yolu, FIRDataSnapshot örneğinde exists() yöntemini çağırmaktır. exists(), snapshot, null değeri içermiyorsa true değerini döndürür.

0

hızlı. Bunu yaptığınızda, veritabanında yinelenen bir kullanıcı oluşturmaya çalışırken bir hata almalısınız.

+0

Bunu zaten yaptım. Şu anda veritabanında bir kullanıcı yolu var. Kullanıcıları tanımlamak için kullanıcı adlarını kullanıyorum. – hvasam

1

observeSingleEvent(of:with:) dönüş yalnızca bir kez

değeri bu deneyin:

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

bu link

+0

Uygulama çalışırken bir dinleyici eklemek anlamlıdır. Ancak uygulama sonlandırıldığında ne olacak? Kullanıcı uygulamayı tekrar başlattığında, değişiklikleri doğru olarak almak için bir dinleyici olmaz mıydı? Önbellek, uygulama yeniden başlatma/veri değişiklikleri yerine zamanla ilgili olduğu varsayımı altındayım. – hvasam

+0

yeniden başlayacak –

+0

Hala benim için çalışmıyor. Garip olan şey, bir saat önce uygulama ile uğraşmayı bıraktığım. Bu * hala * kullanıcı adının alındığını söylüyor. – hvasam